функциональные тесты в 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->text() по-прежнему показывает немецкий текст.

Должен ли я создавать один тест для каждого языка? На мой взгляд, это не проверит переключение языка.

Каков общий способ тестирования такого сценария?


person ivoba    schedule 31.10.2011    source источник


Ответы (1)


Я подозреваю, что это связано с тем, как работает ваш код перевода. Если язык, который используется для перевода, привязан к вашему переводчику, то при втором запросе он может не измениться.

Это одно из ограничений pimple, вы не можете сбросить контейнер.

Вы можете попробовать обойти это, изолируя запросы. Вы делаете это, загружая компонент Symfony Process (просто убедитесь, что автозагрузчик может его найти) и вызывая insulate(true) на своем экземпляре BrowserKit Client.

person igorw    schedule 31.10.2011
comment
Что вы подразумеваете под: привязаны к вашему переводчику? на самом деле я просто регистрирую TranslationServiceProvider и использую: $app['locale'] = $locale; почти так же, как пример в документах - person ivoba; 31.10.2011
comment
Это именно проблема. Транслятор (если смотреть код TranslationServiceProvider) инициализируется параметром locale, который потом используется для дальнейшего существования контейнера. Я открою тикет на силекс-трекере, но не обещаю, что мы его исправим. - person igorw; 31.10.2011
comment
понятно, ладно, пока подкорректирую свои тесты, большое спасибо за информацию - person ivoba; 31.10.2011