2010-10-11 4 views
6

PHPUnit :: W jaki sposób można ustawić i uzyskać ciasteczka, przetestowane bez otrzymania błędu: nagłówki już wysłane?PHPUnit :: W jaki sposób można ustawić i uzyskać ciasteczka, przetestowane?

Przykład które dają błąd:

PHPUnit_Framework_Error_Warning: Nie można zmodyfikować informacje nagłówka - nagłówki już wysłane przez

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)); 
    } 
} 

Dzięki

+0

Btw, masz własną implementację assertThat lub używasz Wydanie wersji kandydat PHPUnit 3.5? http://sebastian-bergmann.de/archives/896-PHPUnit-3.5-Less-this-Required.html#content –

+0

assertTo jest biblioteka Hamcrest.php z phpunitem – Yosef

Odpowiedz

3

Jeśli skrypt PHP robi dowolne wyjście, nagłówki zostaną wysłane - I nie można już ustawić cookie. Musisz wysyłać pliki cookie najpierw, zanim będziesz mógł wyprowadzić dowolny HTML (lub inne wyjście).

Jeśli nie wyprowadzasz żadnego HTML-a, prawdopodobnie jest to biała spacja gdzieś przypadkowo wypisywana, lub znak Unicode Byte-Order. Jeśli twój edytor je obsługuje, ustaw go tak, aby nie zawierał BOM w plikach zakodowanych w UTF-8.

Na koniec można użyć opcji output buffering functions, aby opóźnić wysyłanie danych wyjściowych do momentu wysłania wszystkich nagłówków i ustawienia plików cookie. (Będzie nie fix wyjście przypadkowe przed rozpocząć buforowanie, choć)

+0

Znam problem, ale nie wiem jak rozwiąż to (Twoje rozwiązania nie będą działać). Jeśli masz rozwiązanie, napisz to. – Yosef

+0

"Moje rozwiązania nie działają" to za mało. _ Dlaczego nie działają? Co idzie źle? Z pewnością działają dla mnie dobrze. –

+1

Dla potomności - to nie zadziała, ponieważ PHPUnit pisze rzeczy przed rozpoczęciem testu. Przekierowanie wyjścia do sdterr może pomóc. Zobacz [so] (http://stackoverflow.com/questions/5505130/phpunit-output-causing-zend-session-exceptions) – Jerry