2011-10-31 83 views
0

问题是在测试中,语言不会切换,在网站上是不错的。 所以测试失败。Silex语言切换功能测试

我有这样的路由:

$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->文本()仍显示德语文本。

我必须为每种语言创建一个测试吗? 在我看来,这不会真的测试语言切换。

测试这种情况的常用方法是什么?

回答

2

我怀疑这是由于您的翻译代码的工作原理。如果用于翻译的语言与您的翻译员有关,那么第二个请求中的语言可能不会更改。

这是疙瘩的局限之一,您不能重置容器。

你可以尝试通过隔离请求来解决它。您可以通过加载Symfony Process组件(只需确保自动加载器可以找到它)并在BrowserKit Client实例上调用insulate(true)来完成此操作。

+0

你是什么意思:“绑定到你的翻译”? 实际上,我只需注册TranslationServiceProvider并使用: $ app ['locale'] = $ locale; 与文档中的示例几乎相同 – ivoba

+0

正是这个问题。翻译器(如果您查看TranslationServiceProvider代码)用'locale'参数进行初始化,然后将其用于容器的进一步存在。我会在silex跟踪器上打开一张票,但我不能保证我们会为它找到一个修复程序。 – igorw

+0

我明白了,好吧我现在调整我的测试,非常感谢这些信息 – ivoba