我正在使用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 问题 #435中解决了这个问题。
更新 2
据我所知,只要您在 phpunit XML 文件的基本 URL 中指定语言环境,您似乎就可以安全地测试本地化路由:
<env name="APP_URL" value="http://myapp.dev/en"/>
但是,这适用于本地化的 GET 端点(以语言环境前缀开头,例如“en”),但不适用于非本地化的 POST、PUT 等(没有任何前缀)。因此,您不能真正同时测试两种端点,除非您使用 Dusk(我没有,因为它是一种过度杀伤且速度慢得多,几乎与手动执行相同)。