2014-04-24 109 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

它像一個魅力 –

相關問題