2016-04-26 6 views
5

Я пытаюсь понять, что не так с моим функциональным тестированием или настройками проекта: выполнение phpunit просто распечатывает следующую информацию (я не печатаю это в набор тестов - то есть он не поступает из печати client-> getResponse() или чего-либо еще). Кроме того, в целом выполнение теста прекращается немедленно, без какой-либо информации о результатах после этого текст печатается в командной строке:Функциональный тест Symfony2 распечатывает перенаправление html и прекращает выполнение теста

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <meta http-equiv="refresh" content="1;url=/" /> 

     <title>Redirecting to /</title> 
    </head> 
    <body> 
     Redirecting to <a href="/">/</a>. 
    </body> 
</html> 

После запуска PHPUnit из командной строки:

phpunit -c app --group temp1 src/AppBundle/Tests/Controller/SecurityControllerTest.php 

Мой тестовый код довольно просто:

class SecurityControllerTest extends WebTestCase 
{ 
    /** 
    * test login with succesfull case 
    * 
    * @group login 
    * @group temp1 
    */ 
    public function testLogin_success() 
    { 
     $client = static::createClient(); 
     $crawler = $client->request('GET', '/'); 

     // temp - just to test that the initial crawler location is correct 
     $this->assertGreaterThan(0, $crawler->filter('html:contains("System Login")')->count(), "login page not found"); 

     $client->followRedirects(true); 

     $crawler = $this->loginSubmit($client, $crawler, "[email protected]", "basic_user1_password"); 
     // THE BELOW ROWS ARE NEVER REACHED 

     // test that the user can access the user home 
     $crawler = $client->request('GET', '/user/myprofile'); 
     $this->assertGreaterThan(0, $crawler->filter('html:contains("Welcome to your user profile")')->count(), "User homepage not accessible after login"); 
    } 

    private function loginSubmit($client, $crawler, $username, $password) 
    {   
     $loginButton = $crawler->selectButton('Login'); 
     $loginForm = $loginButton->form(); 
     $loginForm['form[email]'] = $username; 
     $loginForm['form[password]'] = $password; 

     // BELOW IS THE ROW THAT RESULTS IN THE PRINTOUT + TEST EXECUTION STOP 
     return $client->submit($loginForm); 
    } 

    //.... 
} 

Дополнительно e xactly же тестовый пример отлично работает в другом проекте, над которым я работаю, поэтому я стараюсь выкапывать различия в конфигурациях проектов и т. д. без везения.

Любая помощь очень ценится - не стесняйтесь спрашивать какой-либо другой код/​​содержимое конфигурационного файла, если это может быть полезно/актуально.

с использованием Symfony 2.3.12 & PHPUnit 4.1.0

ОБНОВЛЕНО: специфический код цепи, что приводит к ошибке

Таким образом, после управления, чтобы обойти эту проблему путем решения основной проектной сессии вопросы, пара дней назад, я вернулся, чтобы отладить эту проблему еще немного дальше. И в настоящее время, кажется, что результат обусловлен следующим кодом цепи, первый вызова вперед:

$this->forward('bundle:controller:action')->send(); 

и пересылаемого действия контроллера вызова перенаправляет:

$this->redirect($this->generateUrl($route, $parameters))->send(); 

, очевидно, этот поток контроллер кажется немного странным в общем, но остается вопрос, почему это приводит к наблюдаемому результату?

+1

Утверждения приходят после комментария, что ниже строки никогда не достигаются. Я также добавлю их на вопрос – ejuhjav

+0

, проверяете ли вы по умолчанию веб-сервер или apache? –

+0

@GaneshPatil Я запускаю это из командной строки с phpunit (обновленный вопрос) – ejuhjav

ответ

1

Вы можете попробовать добавить некоторые проверки в функции входа:

private function loginSubmit($client, $crawler, $username, $password) 
{ 
    // Check that the HTTP status is good. 
    $this->assertEquals(200, $client->getResponse()->getStatusCode()); 

    // Check that there is a form. 
    $this->assertEquals(1, $crawler->filter('form')->count()); 

    $loginButton = $crawler->selectButton('Login'); 
    $loginForm = $loginButton->form(); 
    $loginForm['form[email]'] = $username; 
    $loginForm['form[password]'] = $password; 

    // BELOW IS THE ROW THAT RESULTS IN THE PRINTOUT + TEST EXECUTION STOP 
    $crawler = $client->submit($loginForm); 

    // Check that the HTTP status is good. 
    $this->assertEquals(200, $client->getResponse()->getStatusCode()); 

    // Check that the login is successful, it depends on your code. 
    // For example if you show a message "Logged in succesfully." in a <div>: 
    $this->assertEquals(1, $crawler->filter('div:contains("Logged in succesfully.")')->count()); 

    // If nothing works, display the rendered HTML to see if there is an error: 
    // die($this->client->getResponse()->getContent()); 

    return $crawler; 
} 
+0

спасибо за усилия, но в результате поведение с этим остается точно таким же. Вызов $ client-> submit ($ loginForm); все еще распечатывает одно и то же сообщение и прерывает выполнение теста. – ejuhjav

+0

@ejuhjav: Если мы прокомментируем $ crawler = $ client-> submit ($ loginForm); этот код, дает ли он правильный результат для всех остальных утверждений? –

+0

@GaneshPatil '$ crawler' не будет определен, он вызовет ошибку PHP. –

2

У меня была эта проблема при входе в в функциональном тесте (official doc), когда я выполнял второй раз, $client->request(...). Отдельные эти одиночные тесты в собственных тестовых классах не решают проблему.

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

Возможно, эта информация поможет вам более изолировать вашу проблему.

+1

спасибо за ответ: мне удалось обойти эту проблему несколько дней назад, разобрав управление сеансом, которое было выполнено в проекте со счастливым сочетанием, используя сеанс из запроса и стандартные функции сеанса php (например, session_id() - который не имел доступа к той же сессии в тестовой среде). Я вернулся к этой оригинальной проблеме и более точно определил виновника; обновил мой вопрос, поскольку я до сих пор не знаю, какая именно причина приводит к этому результату. – ejuhjav

+0

У меня такая же проблема, и я думаю, что это связано с тем, что я тестирую сессионную флешку во время перенаправления. Выполнение прекрасное и тест проходит, но у него все еще есть уродливый вывод html. –

1

Я имел этот вопрос с кодом тестирования

$this->assertTrue($client->getResponse()->isSuccessful()); 

Я был запущен массив относительных адресов через это утверждают. Один из URL-адресов не был успешным, и мое приложение было перенаправлено на этот случай.Вместо отказа от утверждения, phpunit выплескивает html-код RedirectResponse и умирает.

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

  • Нет связанных вопросов^_^