Как сохранить данные с помощью сеансовой службы Symfony2 во время функционального теста?

Я пишу функциональный тест для действия, которое использует службу сеансов Symfony2 для извлечения данных. В методе setUp моего тестового класса я вызываю $this->get('session')->set('foo', 'bar'); , Если я выведу все данные сеанса (используя print_r($this->get('session')->all()); ) либо в setUp либо в реальном методе тестирования, я возвращаюсь foo => bar . Но если я попытаюсь выдавать данные сеанса из проверяемого действия, я возвращаю пустой массив. Кто-нибудь знает, почему это происходит, и как я могу это предотвратить?

Я должен отметить, что если я вызову $_SESSION['foo'] = 'bar' изнутри setUp() данные сохраняются, и я могу получить к нему доступ из действия – эта проблема кажется локальной для сеансовой службы Symfony2.

Сначала попробуйте использовать контейнер своего клиента (я предполагаю, что вы используете WebTestCase):

 $client = static::createClient(); $container = $client->getContainer(); 

Если он по-прежнему не работает, попробуйте сохранить сеанс:

 $session = $container->get('session'); $session->set('foo', 'bar'); $session->save(); 

Я не пробовал это в функциональных тестах, но так оно и работает в шагах Behat.

Вы можете получить услугу «сеанс». С помощью этой услуги вы можете:

  • начать сеанс,
  • установить некоторые параметры в сеанс,
  • сохранить сеанс,
  • передать Cookie с sessionId на запрос

Код может быть следующим:

 use Symfony\Component\BrowserKit\Cookie; .... .... public function testARequestWithSession() { $client = static::createClient(); $session = $client->getContainer()->get('session'); $session->start(); // optional because the ->set() method do the start $session->set('foo', 'bar'); // the session is started here if you do not use the ->start() method $session->save(); // important if you want to persist the params $client->getCookieJar()->set(new Cookie($session->getName(), $session->getId())); // important if you want that the request retrieve the session $client->request( .... ... 

Cookie с $ session-> getId () должен быть создан после начала сеанса

См. Документацию http://symfony.com/doc/current/testing/http_authentication.html#creating-the-authentication-token