php - Laravel 功能测试与区域设置

标签 php laravel localization phpunit

我是 Laravel 新手,我在编写一个测试函数时遇到问题,该函数断言我的欢迎页面的 HTTP 响应为 200,因为我知道我定义了 EN 和 FR 语言环境,这意味着测试应该测试两个本地主机: 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);
}

关于php - Laravel 功能测试与区域设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65909900/

相关文章:

unit-testing - 使用 Mockery 进行 Laravel Controller 测试

<f :viewParam> do not localize to <f:view locale>, 但到默认语言环境的验证/转换错误

c# - 将短语翻译与 String.Format 集成

ios - 如何本地化/国际化不同语言的数据库? - swift

php - 使用 PHP 合并视频文件

javascript - 用js格式化数字价格样式

php - Mysql 转储空文件

laravel - 在 laravel + Vuejs 中缓存或保存 api 响应数据的理想方式是什么?

php - Yii2 Pjax 不工作,重新加载整个页面

php - php 中的数据库随机函数?