2015-01-20 4 views
4

Я пишу модульные тесты для своего приложения. Я написал функцию входа в систему для разных пользователей (для проверки пользовательских уровней) и функции для генерации действительных или недопустимых данных формы (для проверки моей обработки формы).«Невозможно установить идентификатор сеанса после запуска сеанса». при тестировании формы

Когда тест отправляет форму, он бросает исключение:

Uncaught PHP Exception LogicException: "Cannot set session ID after the session has started." 

Я использую Symfony 2.6.4. Я не могу найти полезную информацию об этом сообщении об ошибке. Испытание работало отлично некоторое время назад.

class ControllerTest extends WebTestCase 
{ 
    public $client = null; 
    public $route = 'home/'; 

    /** 
    * @var \Doctrine\ORM\EntityManager 
    */ 
    public $em; 

    public function setUp() 
    { 
     self::bootKernel(); 
     $this->client = static::createClient(); 

     $this->em = static::$kernel->getContainer() 
      ->get('doctrine') 
      ->getManager() 
     ; 
    } 

    public function logIn($role = 'admin') 
    { 
     if ($role === 'admin') { 
      $userId = 20; 
     } elseif ($role === 'user') { 
      $userId = 29; 
     } 
     $user = $this->em->getRepository('Acme\DemoBundle\Entity\User')->find($userId); 

     $session = $this->client->getContainer()->get('session'); 

     $firewall = 'main'; 
     $token = new UsernamePasswordToken($user, $user->getPassword(), $firewall); 
     $session->set('_security_'.$firewall, serialize($token)); 
     $session->save(); 

     $cookie = new Cookie($session->getName(), $session->getId()); 
     $this->client->getCookieJar()->set($cookie); 
    } 

    public function getFormData($valid = true) 
    { 
     //function to generate (in)valid formdata 
    } 

    public function getFormRequest($data, $url) 
    { 
     return $this->client->request(
      'POST', 
      $url, 
      $data, 
      [], 
      [ 
       'CONTENT_TYPE'   => 'application/json', 
       'HTTP_X-Requested-With' => 'XMLHttpRequest', 
      ] 
     ); 
    } 

    //works OK 
    public function testNewScenario() 
    { 
     $url = $this->baseurl . 'new'; 
     $this->logIn('admin'); 

     $crawler = $this->client->request('GET', $url); 
     $this->assertEquals(200, $this->client->getResponse()->getStatusCode(), "Unexpected HTTP status code for GET " . $url); 
    } 

    public function testValidNewScenario() 
    { 
     $this->logIn('admin'); 

     $validData = $this->getFormData(true); 

     //this function throws the exception 
     $this->getFormRequest($validData, $this->baseurl); 

     $this->assertEquals(200, $this->client->getResponse()->getStatusCode(), "Unexpected HTTP status code for POST " . $this->baseurl); 
    } 

} 

Вот соответствующая часть моей config_test.yml:

framework: 
    test: ~ 
    session: 
     storage_id: session.storage.mock_file 
    profiler: 
     collect: false 

Что происходит?

+0

Я не уверен, но похоже, что вам нужно выйти из системы, прежде чем войти в систему как пользователь. – Vick

+0

Вероятно, пользовательский идентификатор, который вы ищете, как изменился? – Matteo

+0

@Matteo Нет, не изменился. –

ответ

1

Я не знаю, является ли это проблемой для ОП, поскольку это старый пост, но та же проблема заставила меня бегать по кругу в течение 3 часов, пытаясь найти выход из нее. И, видя, что там нигде не существует никакого решения. Это возможно.

Проблема возникает в тестах, которые пытаются создать полный логин.

В настоящих документах Symfony указано, что в ваших тестах рекомендуется использовать аутентификацию basic_http, но если, как и мне, вам необходимо тестировать уровни доступа, которые вам необходимо выполнить, this.

Проблема возникает, когда мы пытаемся установить cookieJar. Это (для меня) всегда вызывало ошибку.

Невозможно установить идентификатор сеанса после сеанса начала

решения, как выясняется, является достаточно простым. Оберните код установленного файла cookie в состояние, которое проверяет текущий идентификатор сеанса.

if(!$this->session->getId()) { 
     $this->cookie = new Cookie($this->session->getName(), $this->session->getId()); 
     $this->client->getCookieJar()->set($this->cookie); // <--- this is the problem line 
} 

его также стоит отметить, что вызов $this->session->invalidate()не решить эту проблему.

Надеюсь, это поможет кому-то и сэкономит им некоторое время.

Это повлияло на меня на Symfony2.1 (никаких шансов на обновление), но я видел упоминания о 2.6, когда он сочетался с FOSFacebookBundle (где я считаю, что проблема была исправлена).

+0

Это не работает на symfony 2.7, это не сработает, то есть: пользователь не войдет в систему. – user2268997

Смежные вопросы