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

Can't execute any test on vagrant box using PHPUnit

我在一家公司工作。我知道如何 运行 在 vag运行t 框上进行 PHPUnit 测试。但我不知道为什么我不能 运行 对他们使用 chef 配置的 vag运行t 盒子进行任何测试。每当我执行 运行ning 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

任何帮助都将不胜感激。

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

的测试结果。

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

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

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

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

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

  4. 模拟 built-in header() 函数不实际发送 headers。不过,这可能会改变您的页面的反应方式,因此您最终可能不得不编写更多测试代码。

参考文献: