Я пытаюсь немного поиграть с функциональным тестом в Symfony, и сейчас у меня проблема с сессиями. Я выполняю фрагмент кода, который, кажется, работает, но ничего не сохраняется внутри сеанса моего контейнера.
У меня есть форма, где вы устанавливаете данные. Когда вы отправляете его, он проверяет значения и сохраняет их в сессиях. Затем он перенаправляет на другую страницу, где нужны эти значения, хранящиеся в сеансе.
Цель моего теста — проверить сессию.
<?php
namespace Acme\TestBundle\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage;
use Symfony\Component\HttpFoundation\Session\Session;
class FrontControllerTest extends WebTestCase
{
public function testForm()
{
$client = static::createClient();
$session = $client->getContainer()->get('session');
$crawler = $client->request('GET', '/setParameters');
$form = $crawler->selectButton('Submit')->form();
$form['myForm[firstname]']->setValue('Ben');
$form['myForm[lastname]']->setValue('H');
$client->submit($form);
//I tested and my controller is fully going through the submit handler
//which check the values and save it into the session
//Things are 100% sure there. Then it redirects to another page which check those values.
$values = $client->getContainer()->get('session')->get('parameters'); //NULL
$this->assertEquals($values['firstname'], 'Ben'); //false
$this->assertEquals($values['lastname'], 'H'); //false
}
}
На самом деле это вообще не работает, кажется, что я ничего не могу сохранить в сеансе и получить его.
Может ли кто-нибудь помочь мне с этим? Спасибо.
Контейнер, который вы используете в своем тесте, не является контейнером, который используется запросами, которые вы запускаете. Symfony создает новые контейнеры для каждого запроса. Таким образом, вы не можете получить доступ к сеансу напрямую через контейнер.
Смотрите также http://alexandre-salome.fr/blog/Symfony2-Isolation-Of-Tests
Возможным решением будет извлечь идентификатор сеанса из ваших файлов cookie, а затем прочитать сеанс из вашего хранилища сеансов.
Других решений пока нет …