2011-10-31 8 views
0

問題は、テストでは、Webサイト上のlangauge wont switchがうまくいくことです。 したがって、テストは失敗します。言語スイッチのための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->テキスト()はまだドイツ語のテキストを示し

私はこのルーティングを持っています。

言語ごとに1つのテストを作成する必要がありますか? 私の意見では、それは本当にlangaugeスイッチをテストすることはありません。

このようなシナリオをテストする一般的な方法は何ですか?

答えて

2

これは翻訳コードがどのように動作しているかによると思われます。翻訳に使用される言語が翻訳者に関連付けられている場合は、2回目の要求で変更されないことがあります。

これは、にきびの限界の1つです。容器をリセットすることはできません。

リクエストを分離することで回避できます。これを行うには、Symfony Processコンポーネントをロードし(オートローダが検出できることを確認してください)、BrowserKit Clientインスタンスでinsulate(true)を呼び出します。

+0

「あなたの翻訳者と結びついている」とはどういう意味ですか? 実際に私はTranslationServiceProviderを登録して使用します: $ app ['locale'] = $ locale; ドキュメントの例とほとんど同じです – ivoba

+0

これはまさに問題です。トランスレータ(TranslationServiceProviderコードを見た場合)は、 'locale'パラメータで初期化され、その後、コンテナがさらに存在するために使用されます。サイレックスのトラッカーでチケットを開くつもりですが、私はそれを解決すると約束することはできません。 – igorw

+0

私は今、私のテストを調整して、大丈夫、情報のために多くを参照してください – ivoba

関連する問題