phpunit - "headers already sent"PHPUnit 测试期间返回错误

标签 phpunit output-buffering

我正在使用 PHPUnit 测试一套 REST Web 服务。我们使用输出缓冲来对响应进行 gzip 编码。当我使用 PHPUnit 对服务运行测试时,出现错误:

Cannot modify header information - headers already sent by (output started at /home/dotcloud/php-env/share/php/PHPUnit/Util/Printer.php:172)

它提示我的代码回显是浏览器的输出......

我可以通过添加 ob_start() 暂时解决这个问题。在测试类的顶部调用,但是当我一次运行多个测试时,我再次收到此错误。

有什么想法吗?

最佳答案

有多种选择,各有优缺点:

  • 使用 @runInSeparateProcess 在单独的进程中运行测试,正如你已经发现的那样。 好:更好的测试隔离,坏:性能较差,不适用于全局常量
  • 使用 --stderr将 PHPUnit 输出定向到 STDERR 的标志。 好:测试按预期工作,无需更改,坏:感觉像是一个肮脏的解决方法,可能是 CI 工具的问题
  • 实际上不发送 header 。要么替换使用 header() 的类使用 stub ,或者如果这不容易实现,或者您想进行完整的功能测试,请模拟 header()功能本身。更多关于在 this answer 中模拟内置函数的信息. 好:您也可以测试标题的内容,您的测试确实较少依赖全局状态 坏:您需要编写更多测试代码

  • 我会选择 (3) 并且可能还重构代码以拥有一个负责 header 并且可以轻松模拟的类。

    关于phpunit - "headers already sent"PHPUnit 测试期间返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14152608/

    相关文章:

    phpunit - 找不到 Silverstripe 4 SapphireTest 类

    PHP 输出缓冲区出现白屏并且方法返回时没有错误

    java - 延迟播放音频

    c# - SerialPort 写缓冲区的用途是什么?

    java - Kent Beck 的《TDD by example》一书中的 Java 如何用 PHP 表示?

    php - 对需要发送 header 的项目进行单元测试

    php - 为多个调用指定预期参数的 mock

    php - Travis CI 和 Symfony2 集成 .travis.yml 问题

    在 jupyter 中使用 R 实时打印到控制台

    php:如何使用带有输出缓冲压缩的 readfile 正确地提供文件下载