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

时间:2014-04-24 13:39:29

标签: php unit-testing laravel-4 phpunit

当我在TestCase类上调用parent::setUp()进行单元测试时,我遇到了这个奇怪的问题 当我运行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)

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

4 个答案:

答案 0 :(得分:22)

(更新:感谢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函数内)。并使用@前缀来抑制错误。 e.g。

function setUp() {
  @session_start();
  parent::setUp();
  ...
}

答案 1 :(得分:19)

在PHPUnit中处理此问题的一种方法是将输出发送到stderr而不是stdout,如this answer所示。

phpunit --stderr

或者在this comment中指出的phpunit.xml中添加stderr="true"

答案 2 :(得分:1)

在Laravel中,我通过检查环境并避免有问题的“测试”环境代码来避免此问题。

// Code working in Laravel 4.2
if(App::environment() != 'testing') {
        // this will be skipped when testing
        setcookie('key', $val, time() + (86400 * 999), '/');
}

注意-警告:这意味着您无法测试这段代码!

答案 3 :(得分:1)

 /**
 * @test
 * @runInSeparateProcess
 */
public function testName(){
    //... your test
}