2010-10-11 6 views
6

PHPUnit :: Comment fonctionne cette fonction et obtenir des cookies, testé sans erreur get: les en-têtes déjà envoyés par?PHPUnit :: Comment fonctionne cette fonctionnalité et obtenir des cookies, testé?

Exemple qui donnent l'erreur:

PHPUnit_Framework_Error_Warning: Ne peut pas modifier les informations d'en-tête - têtes déjà envoyés par

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

Merci

+0

BTW, avez-vous votre propre implémentation de assertThat ou vous utilisez une version release candidate de 3,5 PHPUnit? http://sebastian-bergmann.de/archives/896-PHPUnit-3.5-Less-this-Required.html#content –

+0

assertC'est la bibliothèque Hamcrest.php qui va avec phpunit – Yosef

Répondre

3

Si votre script PHP ne une sortie, les en-têtes seront envoyés - Et vous ne pouvez pas placer des cookies plus. Vous devez envoyer des cookies d'abord avant de pouvoir sortir n'importe quel HTML (ou autre sortie).

Si vous ne générez pas de code HTML, il s'agit probablement d'un espace quelque part accidentellement en cours de sortie ou de la marque Unicode Byte-Order. Si votre éditeur le prend en charge, définissez-le pour ne pas inclure la nomenclature dans les fichiers codés en UTF-8.

Enfin, vous pouvez utiliser le output buffering functions pour retarder l'envoi de toutes les sorties jusqu'à ce que vous ayez envoyé tous vos en-têtes et défini vos cookies. (Cela ne solution de sortie accidentelle avant de commencer tampon, bien)

+0

Je connais le problème, mais pas comment résoudre cela (Vos solutions ne fonctionneront pas). Si vous avez une solution, écrivez-la. – Yosef

+0

"Mes solutions ne fonctionnent pas" ne suffit pas. _Pourquoi pas? _ Pourquoi ne fonctionnent-ils pas? Qu'est-ce qui ne va pas? Ils travaillent sûrement pour moi bien. –

+1

Pour la postérité - cela ne fonctionnera pas car PHPUnit écrit des choses avant de commencer le test. Rediriger la sortie vers sdterr peut aider. Voir [so] (http://stackoverflow.com/questions/5505130/phpunit-output-causing-zend-session-exceptions) – Jerry