无法使用PHPUnit对vagrant box执行任何测试

时间:2016-03-25 22:55:54

标签: php laravel unit-testing vagrant phpunit

我在一家公司工作。我知道如何在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

任何帮助都会非常明显。

1 个答案:

答案 0 :(得分:2)

你的测试运行得很好。在您的示例测试中,您调用了visit('en/contact')。它试图访问该网址,但不是200,而是获得了404.您看到的显示是您的测试尝试访问该网址的结果。

问题是app/Http/Middleware/SetCookieData.php中的代码正在尝试修改标头(使用header()函数),但PHPUnit已经将输出写入STDOUT。因此,PHP会抛出一个错误,您在写入输出后尝试修改标头。

这个问题已有几个答案[1] [2] [3],但总结一下:

  1. 使用--stderr选项运行PHPUnit(或将stderr="true"添加到phpunit.xml)。这样,PHPUnit将写入STDERR,因此PHP不会抱怨已经写入STDOUT。这可能是最简单的选择。

  2. 尝试使用@runInSeparateProcess注释进行测试。但是,由于框架的复杂性,您可能会遇到问题。此外,您可能会有许多需要此注释的测试,这将是资源密集型的。

    /**
     * @runInSeparateProcess
     */
    public function testBasicExample()
    {
        // visit('en/contact');
    }
    
  3. 使用--process-isolation标记运行PHPUnit(或将processIsolation="true"添加到phpunit.xml)。可能与@runInSeparateProcess注释相同的问题。

  4. 模拟内置header()函数,实际上不发送标题。但是,这可能会改变您的页面反应方式,因此您可能最终不得不编写更多测试代码。

  5. 参考文献: