如何使用Laravel Localization进行单元测试?

时间:2017-04-16 17:48:21

标签: laravel phpunit laravel-5.4 laravel-localization

我正在使用mcamara/laravel-localization包,我无法弄清楚如何使其与我的单元测试一起使用。以下两个都以红色失败:

// 1. This one results in "Redirecting to http://myapp.dev/en"
$this->get('/')->assertSee('My App Homepage');

// 2. This one results in 404
$this->get('/en')->assertSee('My App Homepage');

在浏览器中,http://myapp.dev返回302,重定向为http://myapp.dev/en,足够公平。但是,http://myapp.dev/en返回200.所以这两种情况在前端都可以100%正常工作,但不能用于单元测试。

但是有一些自定义,再一次,它在浏览器中就像魅力一样。

// in web.php
Route::group([
    'prefix' => app('PREFIX'), // instead of LaravelLocalization::setLocale()
    'middleware' => ['localeSessionRedirect', 'localizationRedirect']],
    function() {
        Route::get('/', function() {
            return view('home');
        });
    }
]);

// in AppServiceProvider.php
public function boot()
{
    // This, unlike LaravelLocalization::setLocale(), will determine the 
    // language based on URL, rather than cookie, session or other
    $prefix = request()->segment(1); // expects 'en' or 'fr'
    $this->app->singleton('PREFIX', function($app) use ($prefix) {
        return in_array($prefix, ['en', 'fr']) ? $prefix : null;
    });
}

希望这段代码对你有意义。谢谢!

更新

我用GitHub issue #435中的包解决了这个问题。

更新2

只要我能解决这个问题,只要您在phpunit XML文件中指定基本URL中的语言环境,就可以安全地测试本地化路由:

<env name="APP_URL" value="http://myapp.dev/en"/>

但是,这适用于本地化的GET端点(以区域设置前缀开头,例如'en'),但不适用于非本地化的POST,PUT等(没有任何前缀)。因此,你不能真正同时测试这两种端点,除非你使用Dusk(我没有使用Dusk,因为它是一种矫枉过正而且速度慢得多,几乎与手动操作相同)。

1 个答案:

答案 0 :(得分:1)

我发现如果您在测试期间转储请求网址,则无论您访问哪个端点,都始终 http://myapp.dev。因此,LaravelLocalization::setLocale()和我的自定义app('PREFIX')都返回null,这意味着在测试期间没有一条路线被定位。你被搞砸了,因为如果你试图访问没有语言环境前缀的路由,你得到302,但如果你确实指定了语言环境,那么框架就找不到该路由的定义。

One article帮助我找到了一个临时解决方案:您需要在hideDefaultLocaleInURLtruelaravellocalization.php。这样,与您的默认语言环境匹配的路由不会有任何前缀,因此您可以将它们测试为非本地化。

然而,问题仍然存在,因为当 本地化时,您应该如何测试应用程序? (例如,当您具有需要测试的语言特定路线时)。这提出了这个包装是否与单元测试本身兼容的问题......

相关问题