我正在使用 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()
的类使用 stub ,或者如果这不容易实现,或者您想进行完整的功能测试,请模拟 header()
功能本身。更多关于在 this answer 中模拟内置函数的信息. 好:您也可以测试标题的内容,您的测试确实较少依赖全局状态 坏:您需要编写更多测试代码 我会选择 (3) 并且可能还重构代码以拥有一个负责 header 并且可以轻松模拟的类。
关于phpunit - "headers already sent"PHPUnit 测试期间返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14152608/