2016-03-25 2 views
1

Я работаю в компании. Я знаю, как запускать тесты PHPUnit на бродячий бокс. Но я не знаю, почему я не могу запустить какой-либо тест на их бродячем поле, настроенном с помощью шеф-повара. Всякий раз, когда я бегу PHPUnit команду, я получаю ниже ошибки:Невозможно выполнить какой-либо тест на бродячий бокс, используя PHPUnit

There was 1 failure: 

1) ExampleTest::testBasicExample 
A request to [en/contact] failed. Received status code [404]. 

/..../vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithPages.php:178 
/..../vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithPages.php:72 
/..../vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithPages.php:53 
/..../tests/ExampleTest.php:16 

Caused by 
ErrorException: Cannot modify header information - headers already sent by (output started at /..../vendor/phpunit/phpunit/src/Util/Printer.php:133) in /..../app/Http/Middleware/SetCookieData.php:17 

Любая помощь будет очень заметным.

ответ

2

Ваш тест работает нормально. В вашем примере теста вы сделали звонок visit('en/contact'). Он попытался посетить этот URL-адрес, но вместо 200 он получил 404. Дисплей, который вы видите, является результатом вашего теста, пытающегося посетить этот URL-адрес.

Проблема заключается в том, что ваш код в app/Http/Middleware/SetCookieData.php пытается изменить заголовки (используя функцию header()), но PHPUnit уже написал вывод в STDOUT. Таким образом, PHP выдает ошибку, которую вы пытаетесь изменить заголовки после записи вывода.

Есть несколько ответов [1] [2] [3] для этой проблемы уже, но резюмировать здесь:

  1. Run PHPUnit с опцией --stderr (или добавить stderr="true" к вашему phpunit.xml). Таким образом, PHPUnit будет писать в STDERR, поэтому PHP не будет жаловаться на то, что уже написал STDOUT. Вероятно, это самый простой вариант.

  2. Попытка использования аннотации @runInSeparateProcess для вашего теста. Хотя, вы можете столкнуться с проблемами из-за сложности структуры. Кроме того, у вас, вероятно, будет много тестов, требующих этой аннотации, и это будет ресурсоемким.

    /** 
    * @runInSeparateProcess 
    */ 
    public function testBasicExample() 
    { 
        // visit('en/contact'); 
    } 
    
  3. Run PHPUnit с --process-isolation флагом (или добавить processIsolation="true" к вашему phpunit.xml). Вероятно, такие же проблемы, как аннотация @runInSeparateProcess.

  4. Откажитесь от встроенной функции header(), чтобы фактически не отправлять заголовки. Хотя, это может изменить то, как ваши страницы реагируют, поэтому вам, вероятно, придется написать дополнительный тестовый код.

Ссылки:

+0

Но страница прямо там. Я могу просмотреть URL-адрес. Почему это дает 404 ошибки, это мой вопрос. –

+0

@WilliamFrancisGomes Я обновил свой ответ. – patricus

+0

Спасибо. Будет проверять и сообщать вам. –

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