2010-10-11 85 views
6

PHPUnit ::如何設置和獲取cookie的函數,測試沒有得到錯誤:頭已經發送?PHPUnit ::如何設置和獲取cookie的功能,測試?

,讓錯誤:

PHPUnit_Framework_Error_Warning:不能更改頭信息 - 已經

MyCookie.php

class MyCookie{ 
public static function createCookie(){ 
     $uid = null; 
     $cookieName='test_cookie'; 
     if(!isset($_COOKIE[$cookieName])){ 
      $uid = unique_hash(); 
      setcookie($cookieName, $uid, 0, '', '', false, true); 
     } 
     else{ 
      $uid=$_COOKIE[$cookieName]; 
     } 
     return $uid; 
    } 
} 

MyCookieTest.php

發送了頭
class MyCookieTest extends PHPUnit_Framework_TestCase{ 
    public function test_createCookie(){ 
      MyCookie::createCookie(); 
      assertThat(isset($_COOKIE['test_cookie']), is(true)); 
      unset($_COOKIE['test_cookie']); 
      MyCookie::createCookie(); 
      assertThat(isset($_COOKIE['test_cookie']), is(true)); 
    } 
} 

感謝

+0

順便說一句,你有自己的實現assertThat的或者您使用的PHPUnit的3.5發佈候選版本? http://sebastian-bergmann.de/archives/896-PHPUnit-3.5-Less-this-Required.html#content – 2010-10-15 14:18:57

+0

assertThat是Hamcrest.php庫與phpunit – Yosef 2010-10-29 12:52:05

回答

3

如果你的PHP腳本做任何輸出,頭部將被髮送 - 你不能設置cookies了。在輸出任何HTML(或其他輸出)之前,您必須首先發送曲奇

如果您不輸出任何HTML,則可能是意外輸出的空白或Unicode字節順序標記。如果您的編輯器支持它,請將其設置爲不包含UTF-8編碼文件中的BOM。

最後,您可以使用output buffering functions延遲發送任何輸出,直到您發送了所有標題並設置了Cookie。 (這將修復偶然輸出開始之前緩存,雖然)

+0

去知道這個問題,但不知道如何解決這個問題(你的解決方案將無法工作)。如果你有解決方案,請寫下來。 – Yosef 2010-10-29 12:54:25

+0

「我的解決方案不起作用」還不夠。 _爲什麼不呢?_他們爲什麼不工作?出了什麼問題?他們確實對我很好。 – 2010-10-29 13:33:43

+1

對於後人 - 它不起作用,因爲PHPUnit在開始測試之前先寫東西。將輸出重定向到sdterr可以提供幫助。見[so](http://stackoverflow.com/questions/5505130/phpunit-output-causing-zend-session-exceptions) – Jerry 2013-02-07 18:21:31