我正在使用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。因此,这两种情况在前端都能很好地工作,但单元测试就不行了。
我确实有一些定制,但是,这再次,工作在浏览器中的魅力。
// 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 (我不使用Dusk,因为这太过了,而且速度要慢得多,几乎与手动测试一样)。
发布于 2017-04-18 23:41:07
我发现,如果您在测试期间转储请求URL,那么无论您访问哪个端点,都是始终是 http://myapp.dev。因此,LaravelLocalization::setLocale()和我的自定义app('PREFIX')都返回null,这意味着在测试期间没有一条路由被本地化。无论哪种方式,您都会失败,因为如果您试图访问一个没有区域设置前缀的路由,就会得到302,但是如果指定了区域设置,框架就无法为该路由找到定义。
一篇文章帮助我找到了一个临时解决方案:您需要hideDefaultLocaleInURL to true in laravellocalization.php。这样,与默认区域设置相匹配的路由就不会有任何前缀,所以您可以测试它们,就好像它们是非本地化的一样。
但是,问题仍然存在,因为当应用程序本地化时,应该如何测试它?(例如,当您有需要测试的特定语言路线时)。这就提出了这个包是否与单元测试本身兼容的问题.
发布于 2022-01-13 15:08:34
问题所在
使用mcamara /laravel本地化,当我测试一个显示路径时,我会得到一个404错误。
例如,测试此路由将返回404:
Route::get('/posts/{post:slug}', [PostController::class, 'show'])->name('posts.show');测试:
/** @test */
public function itShouldDisplayThePostsShowViewToGuestUser()
{
$response = $this->get("/posts/{$this->post1->slug}");
$response->assertStatus(200);
$response->assertViewIs('posts.show');
}解决方案
在测试时,我解决了对URL隐藏区域设置的问题。
在phpunit.xml的末尾创建这个env变量。
...
<env name="LOCALIZATION_HIDE_DEFAULT_LOCALE" value="true"/>
</php>
</phpunit>并在config/laravellocalization.php中设置如下所示的hideDefaultLocaleInURL:
'hideDefaultLocaleInURL' => env('LOCALIZATION_HIDE_DEFAULT_LOCALE', false)这一解决方案是受到这篇文章的启发:
https://github.com/mcamara/laravel-localization/issues/161#issuecomment-381367191
https://stackoverflow.com/questions/43440215
复制相似问题