2014-04-24 187 views
7

我有这个奇怪的问题,当我呼吁我的TestCase类的parent::setUp()的单元测试类 当我运行的PHPUnit扔我这个错误:不能发送会话cookie - 标题已经发出的PHPUnit/Laravel

1) MatchRequestRepositoryTest::test_find_requests_by_match_id ErrorException: session_start(): Cannot send session cookie - headers already sent by (output started at /var/www/project.dev/vendor/phpunit/phpunit/PHPUnit/TextUI/TestRunner.php:459)

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

+2

请检查: http://stackoverflow.com/questions/8028957/how-to-fix-headers-already-sent-error-in-php – DOZ

+0

你必须分享你的测试内容。另外,您的应用程序是否通过本地'session_'函数调用或'Session ::'来直接操作会话? – Andreas

+0

[用PHPunit测试PHP头文件]可能的副本(http://stackoverflow.com/questions/9745080/test-php-headers-with-phpunit) –

回答

19

问题是,您有一些代码,可能在您使用的框架中很深,称为session_start()。这反过来又想发送一个cookie。但PHPUnit已经开始将输出写入标准输出。

这里要实现的关键是,这只是一个单元测试,没有人关心标题。所以只是压制错误信息。在不改变被测系统的情况下,你可以在你自己的单元测试中调用session_start()(在parent::setUp()之前或在setUp函数中)。并使用前缀@来抑制错误。例如

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

不幸的是,这个解决方案仍然会为您的测试产生一个错误。它会产生这样的事情: '有1个错误: 1)Classname :: ClassTest 会话已经开始 - 忽略session_start()' – w00tland

+1

@ w00tland“@'应该停止报告任何错误或警告。你有抱怨的线路上有'@'吗?添加/删除“@”是否会更改错误消息? (如果你不能让消息消失,这可能是值得开始一个新问题;这是关于如何摆脱“标题已发送”的投诉。) –

+2

我知道它应该防止报告警告。我上面分享的消息是压制消息的结果。是的,如果我删除了@,那么我将得到'不能发送会话cookie - 已经由'消息发送的标题。 而我有完全相同的问题;我只是想摆脱“头文件已发送”的消息。 – w00tland

11

PHPUnit中做到这一点,最好的方法是发送输出由this answer证明标准错误而不是标准输出。

phpunit --stderr 
+0

有没有使用这种背道而驰?或者根本没有问题?谢谢 – Carlos

+1

@Carlos我还没有发现任何问题。 –

+1

它像一个魅力 –

相关问题