2010-10-11 3 views
6

PHPUnit :: Come può funzionare impostare e ricevere i cookie, testati senza errori: le intestazioni già inviate da?PHPUnit :: Come può funzionare impostare e ottenere i cookie, testato?

Esempio che danno errore:

PHPUnit_Framework_Error_Warning: Non è possibile modificare le informazioni di intestazione - headers already sent by

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

Grazie

+0

Btw, avete una propria implementazione di assertThat o stai usando una versione release candidate di PHPUnit 3.5? http://sebastian-bergmann.de/archives/896-PHPUnit-3.5-Less-this-Required.html#content –

+0

assertThat è Hamcrest.php libreria che andare con PHPUnit – Yosef

risposta

3

Se lo script PHP fa qualsiasi output, le intestazioni saranno inviati - e non è possibile impostare più cookie. È necessario inviare i cookie prima prima di poter stampare qualsiasi HTML (o altro output).

Se non si sta emettendo alcun codice HTML, è probabile che sia uno spazio bianco in qualche modo in uscita o il Marchio ordine byte Unicode. Se il tuo editor lo supporta, impostalo per non includere la distinta base nei file codificati UTF-8.

Infine, è possibile utilizzare output buffering functions per ritardare l'invio di qualsiasi output fino a quando non si sono inviate tutte le intestazioni e impostare i cookie. (Questo non correzione dell'uscita accidentale prima di iniziare il buffering, però)

+0

So che il problema, ma non come risolvilo (le tue soluzioni non funzioneranno). Se avete una soluzione, scrivetela. – Yosef

+0

"Le mie soluzioni non funzioneranno" non è sufficiente. _Perché no? _ Perché non funzionano? Cosa non va? Di sicuro funzionano per me bene. –

+1

Per i posteri - non funzionerà perché PHPUnit scrive cose prima che inizi il test. Può essere utile reindirizzare l'output a sdterr. Vedi [so] (http://stackoverflow.com/questions/5505130/phpunit-output-causing-zend-session-exceptions) – Jerry