laravel 语言环境功能测试

laravel feature tests with locales

我是 Laravel 的新手,我在编写一个测试函数时遇到问题,该函数断言我的欢迎页面的 HTTP 响应是 200,我知道我定义了 EN 和 FR 语言环境,这意味着测试应该同时测试 localhost:8000/en 和 localhost:8000/fr.

这是我的exampletest.php:

<?php

namespace Tests\Feature;

use App\Http\Middleware\SetLanguage;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */


    public function testBasicTest()
    {
        $response = $this->get('/');

        $response->assertStatus(301);
    }

    public function test_getRedirected_DefaultedEnglish_WelcomePage()
    {
        $response = $this->get('/en');

        $response->assertStatus(200);
    }

    public function test_getRedirected_French_WelcomePage()
    {
        $response = $this->get('/fr');

        $response->assertStatus(200);
    }
}

我不喜欢为 /en 和 /fr 编写两次代码。

这是我的 web.php:

<?php

use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Auth;

Route::redirect('/', 'en', 301);

Route::group(['prefix' => '{lang}', 'where' => ['lang' => '[a-zA-Z]{2}'], 'middleware' => 'setlanguage'], function() {
    Auth::routes();
    Route::get('/','App\Http\Controllers\welcomeController@index')->name('welcome');
});

我已经在下面编写了我的本地化中间件:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;

class SetLanguage
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {

        App::setLocale($request->lang);
        return $next($request);
    }
}

非常感谢您在上述方面的帮助。我认为测试应该是动态的。

提前谢谢你..

如果您想测试多个语言环境,我认为没有任何方法可以避免重复自己。但是没有要求将每个测试放在一个单独的方法中。这可能有效,但我从未在我的应用程序中对多个语言环境进行过测试。

public function provideLocales(): array
{
    return [
        "english" => ["en"],
        "francais" => ["fr"],
    ];
}

/**
 * @dataProvider provideLocales
 */
public function testWelcomePage($locale): void
{
    $this->app->setLocale($locale);
    $this->get(route("welcome"))
        ->assertStatus(200);
}

您可以更进一步,实际检查是否正确提供了本地化内容。

public function provideLocales(): array
{
    return [
        "english" => ["en", "welcome"],
        "francais" => ["fr", "bienvenue"],
    ];
}

/**
 * @dataProvider provideLocales
 */
public function testWelcomePageContents($locale, $text): void
{
    $this->app->setLocale($locale);
    $this->get(route("welcome"))
        ->assertStatus(200)
        ->assertSeeText($text);
}