我在一家公司工作。我知道如何在vagrant box上运行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
任何帮助都会非常明显。
答案 0 :(得分:2)
你的测试运行得很好。在您的示例测试中,您调用了visit('en/contact')
。它试图访问该网址,但不是200,而是获得了404.您看到的显示是您的测试尝试访问该网址的结果。
问题是app/Http/Middleware/SetCookieData.php
中的代码正在尝试修改标头(使用header()
函数),但PHPUnit已经将输出写入STDOUT。因此,PHP会抛出一个错误,您在写入输出后尝试修改标头。
这个问题已有几个答案[1] [2] [3],但总结一下:
使用--stderr
选项运行PHPUnit(或将stderr="true"
添加到phpunit.xml
)。这样,PHPUnit将写入STDERR,因此PHP不会抱怨已经写入STDOUT。这可能是最简单的选择。
尝试使用@runInSeparateProcess
注释进行测试。但是,由于框架的复杂性,您可能会遇到问题。此外,您可能会有许多需要此注释的测试,这将是资源密集型的。
/**
* @runInSeparateProcess
*/
public function testBasicExample()
{
// visit('en/contact');
}
使用--process-isolation
标记运行PHPUnit(或将processIsolation="true"
添加到phpunit.xml
)。可能与@runInSeparateProcess
注释相同的问题。
模拟内置header()
函数,实际上不发送标题。但是,这可能会改变您的页面反应方式,因此您可能最终不得不编写更多测试代码。
参考文献: