2016-06-24 6 views
2
.

. Я пытаюсь создать функциональный тест, который включает в себя сохранение переменной сеанса при переадресации. Частично работает запись, но я не могу установить и сохранить переменную сеанса.Настройка переменной сеанса для использования в контроллере Symfony. Тесты PHPUnit с переадресацией.

Испытательный класс расширяет WebTestCase.

$this->client = static::createClient(); 
$this->client->followRedirects(); 

аутентичности

$user = $em->getRepository('MyApp\AppBundle\Entity\User') 
     ->findOneByUsername('gagarin'); 
$firewall = 'secured_area'; 
$token = new UsernamePasswordToken($user, $user->getPassword(), 
     $firewall, $user->getRoles()); 
self::$kernel->getContainer()->get('security.context')->setToken($token); 
$session = $this->client->getContainer()->get('session'); 
$session->set('_security_' . $firewall, serialize($token)); 
// tried $session->set('color_id', 1234) here 
$session->save(); 
$cookie = new Cookie($session->getName(), $session->getId()); 
$this->client->getCookieJar()->set($cookie); 

устройство «/» маршрут будет перенаправлять на страницу входа в систему, а затем обратно в «/» страницы потому что followRedirects устанавливается истина.

$crawler = $this->client->request(
     'GET', 
     'http://myapp.test/'); 
$this->assertTrue($this->client->getResponse()->isSuccessful()); 

То, что я хотел бы сделать, это установить переменную сеанса (color_id), который я могу утверждать, существует на запрошенный маршрут, следуя переадресаций авторизоваться или других страниц, что «/» маршрутов на основе color_id. Как мне это сделать?

ответ

0

Я поместил свою аутентификацию в собственный класс AbstractControllerTest. Вот соответствующий код для обработки сеанса:

abstract class AbstractControllerTest extends WebTestCase 
{ 
    protected $session = []; 

    public function addSession($session): void 
    { 
     $this->session = array_merge($this->session, $session); 
    } 

    protected function createAuthorizedClient() 
    { 
     //Here comes your client logic... 

     foreach ($this->session as $sessionKey => $sessionValue) { 
      $session->set($sessionKey, $sessionValue); 
     } 

     $container->get('session')->save(); 
     $client->getCookieJar()->set(new Cookie($session->getName(), $session->getId())); 

     return $client; 
    } 
} 

В вашем использовании Test AbstractControllerTest и установить дополнительный переменный сеанс в настройках() метод, как это:

class MyTest extends AbstractControllerTest 
{ 
    public function setUp(): void 
    { 
     $this->addSession(['variable' => 'value']); 

     parent::setUp(); 
    } 
}