问题是在测试中langauge不会切换,在网站上做得很好。 所以测试失败了。
我有这个路由:
$app->before(function () use ($app) {
if ($locale = $app['request']->get('locale')) {
$app['locale'] = $locale;
}
...
});
$app->get('/{locale}/index', function () use ($app) {
return $app['twig']->render('index.twig');
})->assert('locale',implode('|', $app['languages']));
$app->get('/{locale}', function () use ($app) {
return $app->redirect("/".$app['locale']."/index");
})->assert('locale',implode('|', $app['languages']));
测试是这样的:
public function testLanguageRoutes(){
$client = $this->createClient();
$client->followRedirects();
$crawler = $client->request('GET', '/de');
$this->assertTrue($client->getResponse()->isOk());
$this->assertTrue($crawler->filter('html:contains("Kopf")')->count() > 0);
$crawler = $client->request('GET', '/de/index');
$this->assertTrue($client->getResponse()->isOk());
$this->assertTrue($crawler->filter('html:contains("Kopf")')->count() > 0);
$crawler = $client->request('GET', '/fr');
$this->assertTrue($client->getResponse()->isOk());
//TODO not working, still returns de should return fr
var_dump($crawler->text());
$this->assertTrue($crawler->filter('html:contains("Pied")')->count() > 0);
$crawler = $client->request('GET', '/aa');
$this->assertTrue($client->getResponse()->isNotFound());
}
此处切换到法语不会工作, $ crawler-> text()仍显示德语文本。
我是否必须为每种语言创建一个测试? 在我看来,那不会真正测试语言切换。
测试类似场景的常用方法是什么?
答案 0 :(得分:2)
我怀疑这是由于您的翻译代码的工作方式。如果用于翻译的语言与您的翻译器绑定,则第二次请求可能不会更改。
这是疙瘩的局限之一,你无法重置容器。
您可以通过隔离请求来尝试解决它。您可以通过加载Symfony Process
组件(只需确保自动加载器可以找到它)并在insulate(true)
实例上调用BrowserKit Client
来执行此操作。