Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;“已发送邮件头”;PHPUnit测试期间返回的错误_Phpunit_Output Buffering - Fatal编程技术网

&引用;“已发送邮件头”;PHPUnit测试期间返回的错误

&引用;“已发送邮件头”;PHPUnit测试期间返回的错误,phpunit,output-buffering,Phpunit,Output Buffering,我正在用PHPUnit测试一套restweb服务。我们使用输出缓冲来对响应进行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_s

我正在用PHPUnit测试一套restweb服务。我们使用输出缓冲来对响应进行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()
调用,我可以暂时解决这个问题,但是当我同时运行多个测试时,我再次遇到这个错误


有什么想法吗?

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

  • 正如您已经发现的,使用
    @runinsepareprocess
    在单独的进程中运行测试良好:更好的测试隔离,较差:较差的性能,无法与全局常量配合使用
  • 使用
    --stderr
    标志将PHPUnit输出定向到stderr好:测试在没有更改的情况下按预期工作,坏:感觉像是一个肮脏的解决方法,可能是CI工具的问题
  • 不要实际发送标题。用存根替换使用
    header()
    的类,或者如果这不容易实现,或者您想进行完整的功能测试,则模拟
    header()
    函数本身。有关模拟中内置函数的详细信息Good:您也可以测试标题的内容,您的测试对全局状态的依赖性会降低Bad:您需要编写更多的测试代码

  • 我会选择(3)并且可能会重构代码,以拥有一个单独的类来负责标题,并且可以很容易地进行模拟。

    很可能在您的
    echo
    之前已经发送了一些东西,但是如果您不显示任何代码,我们将无法进一步帮助您感谢@bart,但是如果有,上面的错误消息可能引用了“某物”所在的位置,而不是我最终向浏览器回显响应的位置。在实际的回应之前,我没有回应任何东西-但是PHPUnit也是。。。添加了@outputBuffering注释,但不清楚它到底是做什么的。在这里找到了答案:必须单独运行测试。可能重复