无法发送会话cookie - 标头已经发送过PHPUnit/Laravel

Fab*_*lio 11 php phpunit unit-testing laravel-4

我有一个奇怪的问题当我parent::setUp()在我的TestCase类上调用单元测试一个类时,我运行phpunit时它会抛出这个错误:

1)MatchRequestRepositoryTest :: test_find_requests_by_match_id ErrorException:session_start():无法发送会话cookie - 已经发送的头文件(输出从/var/www/project.dev/vendor/phpunit/phpunit/PHPUnit/TextUI/TestRunner.php:459开始)

可能是什么问题?谢谢你的帮助.

Dar*_*ook 23

(更新:感谢Louis Charette的评论,这只适用于php 7.1及更早版本(并且阅读错误报告,听起来像是他们不打算修复的回归.因此,更好的解决方案是Jeff Puckett(https:/ /stackoverflow.com/a/38045422/841830),--stderr在命令行上给出了标志phpunit.这样可以保存代码的stdout,phpunit的stderr,这样它们就不会发生冲突.)


问题是你有一些代码,可能深入你使用的框架,调用session_start().反过来,这又想发送一个cookie.但PHPUnit已经开始将输出写入stdout.

这里要理解的是,这只是一个单元测试,没有人关心标题.所以只需抑制错误信息.在不改变被测系统的情况下,这样做的方法是在自己的单元测试中调用session_start()(在parent::setUp()setUp函数之前或之内).并使用@前缀来抑制错误.例如

function setUp() {
  @session_start();
  parent::setUp();
  ...
}
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,此解决方案仍会为您的测试产生错误.它会产生这样的结果:`有1个错误:1)Classname :: ClassTest会话已经启动 - 忽略session_start()` (2认同)
  • 我知道这应该可以防止报警.我上面分享的消息是抑制消息的结果.是的,如果删除@,我会收到`无法发送会话cookie - 已经发送的标题'消息.我有完全相同的问题; 我只是想摆脱"已发送的标题"消息. (2认同)
  • 对于通过Google发现此问题的人来说,此修复程序可能会在PHP 7.2中产生与`session_set_save_handler`相关的另一组错误。请参阅:https://bugs.php.net/bug.php?id=75628 Jeff Puckett答案是相对于PHP 7.2更改的更好解决方案。 (2认同)

Jef*_*ett 22

PHPUnit中处理的一种方法是将输出发送到stderr,而不是stdout因为被证明了这个答案.

phpunit --stderr
Run Code Online (Sandbox Code Playgroud)

或者通过添加stderr="true"您的phpunit.xml,如此评论中指出的那样.

  • 这应该是最好的答案! (3认同)