【问题标题】:"headers already sent" Error returned during PHPUnit tests“标头已发送” PHPUnit 测试期间返回的错误
【发布时间】:2012-12-18 14:58:29
【问题描述】:

我正在使用 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() 调用来临时解决此问题,但是当我一次运行多个测试时,我再次收到此错误。

有什么想法吗?

【问题讨论】:

  • 在您的echo 之前可能已经发送了一些东西,但如果您没有显示任何代码,我们将无法为您提供更多帮助
  • 谢谢@bart,但如果有的话,上面的错误消息会引用那个“东西”所在的地方——而不是我最终回应浏览器响应的地方。在实际响应之前我没有回应任何内容 - 但 PHPUnit 是......
  • 还...添加了 @outputBuffering 注释,但不清楚具体是做什么的。它没有任何效果。
  • 在这里找到答案:stackoverflow.com/questions/9745080/… 必须单独运行测试。

标签: phpunit output-buffering


【解决方案1】:

有几种不同的优缺点:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-15
    • 2013-06-07
    • 1970-01-01
    • 2014-06-09
    • 2010-11-16
    • 2023-03-11
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多