2011-10-31 82 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