首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Laravel本地化进行单元测试?

如何使用Laravel本地化进行单元测试?
EN

Stack Overflow用户
提问于 2017-04-16 17:48:20
回答 2查看 3.7K关注 0票数 6

我正在使用mcamara/laravel-localization包,我不知道如何使它与我的单元测试一起工作。对于红色,以下两项都失败了:

代码语言:javascript
复制
// 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。因此,这两种情况在前端都能很好地工作,但单元测试就不行了。

我确实有一些定制,但是,这再次,工作在浏览器中的魅力。

代码语言:javascript
复制
// 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中的区域设置,您就可以安全地测试本地化路由:

代码语言:javascript
复制
<env name="APP_URL" value="http://myapp.dev/en"/>

但是,这将适用于本地化的GET端点(以地区前缀开头,例如'en'),但不适用于非本地化的POST、PUT等(它们没有任何前缀)。因此,您不能同时测试这两种端点,除非您使用Dusk (我不使用Dusk,因为这太过了,而且速度要慢得多,几乎与手动测试一样)。

EN

回答 2

Stack Overflow用户

发布于 2017-04-18 23:41:07

我发现,如果您在测试期间转储请求URL,那么无论您访问哪个端点,都是始终是 http://myapp.dev。因此,LaravelLocalization::setLocale()和我的自定义app('PREFIX')都返回null,这意味着在测试期间没有一条路由被本地化。无论哪种方式,您都会失败,因为如果您试图访问一个没有区域设置前缀的路由,就会得到302,但是如果指定了区域设置,框架就无法为该路由找到定义。

一篇文章帮助我找到了一个临时解决方案:您需要hideDefaultLocaleInURL to true in laravellocalization.php。这样,与默认区域设置相匹配的路由就不会有任何前缀,所以您可以测试它们,就好像它们是非本地化的一样。

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

票数 1
EN

Stack Overflow用户

发布于 2022-01-13 15:08:34

问题所在

使用mcamara /laravel本地化,当我测试一个显示路径时,我会得到一个404错误。

例如,测试此路由将返回404:

代码语言:javascript
复制
Route::get('/posts/{post:slug}', [PostController::class, 'show'])->name('posts.show');

测试:

代码语言:javascript
复制
/** @test */
public function itShouldDisplayThePostsShowViewToGuestUser()
{
    $response = $this->get("/posts/{$this->post1->slug}");

    $response->assertStatus(200);
    $response->assertViewIs('posts.show');
}

解决方案

在测试时,我解决了对URL隐藏区域设置的问题。

在phpunit.xml的末尾创建这个env变量。

代码语言:javascript
复制
    ...
    <env name="LOCALIZATION_HIDE_DEFAULT_LOCALE" value="true"/>
    </php>
</phpunit>

并在config/laravellocalization.php中设置如下所示的hideDefaultLocaleInURL:

代码语言:javascript
复制
'hideDefaultLocaleInURL' => env('LOCALIZATION_HIDE_DEFAULT_LOCALE', false)

这一解决方案是受到这篇文章的启发:

https://github.com/mcamara/laravel-localization/issues/161#issuecomment-381367191

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43440215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档