我正在使用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中的包解决了这个问题。
只要我能解决这个问题,只要您在phpunit XML文件中指定基本URL中的语言环境,就可以安全地测试本地化路由:
<env name="APP_URL" value="http://myapp.dev/en"/>
但是,这适用于本地化的GET端点(以区域设置前缀开头,例如'en'),但不适用于非本地化的POST,PUT等(没有任何前缀)。因此,你不能真正同时测试这两种端点,除非你使用Dusk(我没有使用Dusk,因为它是一种矫枉过正而且速度慢得多,几乎与手动操作相同)。
答案 0 :(得分:1)
我发现如果您在测试期间转储请求网址,则无论您访问哪个端点,都始终 http://myapp.dev
。因此,LaravelLocalization::setLocale()
和我的自定义app('PREFIX')
都返回null
,这意味着在测试期间没有一条路线被定位。你被搞砸了,因为如果你试图访问没有语言环境前缀的路由,你得到302,但如果你确实指定了语言环境,那么框架就找不到该路由的定义。
One article帮助我找到了一个临时解决方案:您需要在hideDefaultLocaleInURL
中true
到laravellocalization.php
。这样,与您的默认语言环境匹配的路由不会有任何前缀,因此您可以将它们测试为非本地化。
然而,问题仍然存在,因为当 本地化时,您应该如何测试应用程序? (例如,当您具有需要测试的语言特定路线时)。这提出了这个包装是否与单元测试本身兼容的问题......