14

我正在使用 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()我可以通过在测试类的顶部添加一个调用来临时解决这个问题,但是当我一次运行多个测试时,我再次收到此错误。

有任何想法吗?

4

1 回答 1

21

有几种不同的优点和缺点的选择:

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

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

于 2015-12-14T17:41:28.733 回答