2011-03-29 70 views
3

我想在一個相當好的IDE PhpStorm中使用setcookie()函數進行一些單元測試。但我得到了以下錯誤每次:PhpStorm,PHPUnit和setcookie

Cannot modify header information - headers already sent by (output started at /tmp/phpunit.php:418) 

或許這個錯誤的原因是打印的setcookie之前(「一些文本」)平齊()()調用。但是沖洗是在PhpStorm生成的/tmp/phpunit.php文件中執行的。雖然setcookie()從我的來源調用。所以我不能編輯生成的文件來做某種輸出緩衝。也有一些其他的時刻:PhpStorm執行/tmp/phpunit.php這樣的腳本:

/usr/bin/php /tmp/phpunit.php -config /var/www/.../protected/tests/phpunit.xml d /var/www/.../protected/tests/unit/user 

請幫我解決這個問題。我如何直接從PhpStorm運行單元測試?

+0

可能重複[PHPUnit的 - 單元測試與需要發送的報頭項目]( http://stackoverflow.com/questions/190292/phpunit-unit-testing-with-items-that-need-to-send-headers) – outis 2012-09-24 20:26:54

+0

我正在使用以下內容:phpunit --stderr 使用setcookie時工作。 http://stackoverflow.com/questions/9745080/test-php-headers-with-phpunit – HMR 2012-11-26 05:04:00

回答

5

解決此問題的一種方法是對setcookie()函數使用「模擬」替換。

這是單元測試中的一種常用技術,您希望測試某些依賴於不想影響當前測試的外部類或函數。

這樣做的方法是在你的單元測試代碼中爲setcookie()創建一個存根函數定義。這將在測試期間被調用,而不是真正的setcookie()函數。具體如何實現這個存根函數取決於你的代碼使用它。

這種方法會遇到的主要問題是,PHP不允許您默認覆蓋現有函數 - 如果您在標準PHP安裝中嘗試這樣做,您將得到「錯誤:函數無法重新聲明」。

此問題的解決方案是PHP的Runkit extension,它明確爲此類測試而設計,並且允許您使用rename an existing function(包括內置測試)。

如果您在測試環境中配置PHP安裝以包含Runkit擴展,那麼您將能夠執行此類測試。

希望有所幫助。

+0

非常感謝您的回答,Spudley!這是一個非常好的主意。我將盡快在我的測試環境中嘗試Runkit。 – 2011-03-29 10:31:30

+6

如果您不想或不能使用RunKit(即使可以),我建議創建一個封裝所有cookie操作的類。然後,您可以爲該類創建一個模擬對象,以避免完全調用'setcookie()'。 – 2011-03-29 16:00:53

+1

謝謝你的回答,大衛!看來你的觀點更加適用。但是我已經通過重新定義'setcookie()'來成功運行runkit:'runkit_function_redefine('setcookie','$ name,$ value = null,$ expire = null,$ path = null,$ domain = null,$ secure = null,$ httponly = null','');' – 2011-03-30 04:12:22

2

我發現了一個更簡單的解決方案。考慮這個類:

class Cookie 
{ 
    public function set($name, $value) 
    { 
     return setcookie($name, $value); 
    } 
} 

測試將扔在問題中所述,除非你設置註釋錯誤@runInSeparateProcess

class CookieTest 
{ 
    /** 
    * @runInSeparateProcess 
    */ 
    function test_set() 
    { 
     $cookie = new Cookie; 
     $this->assertTrue($cookie->set('mycookie', 'myvalue'); 
    } 
} 
+0

測試將失敗,因爲'Cookie :: set'返回void。 – amphetamachine 2017-07-25 22:26:30

+0

@amphetamachine謝謝。固定。 – 2017-07-26 09:07:41