2010-11-10 19 views
1

J'ai simpletest mis en place avec CodeIgniter (https://github.com/ericbarnes/codeigniter-simpletest)php (CodeIgniter) - tests unitaires simpletest w/données de session

J'ai quelques tests simples en cours d'exécution et les choses semblent bonnes. Mais je frappe un bloc. Je ne sais pas comment tester en utilisant des données de session. En fait, les tests fonctionnent très bien. Mais je reçois des exceptions. Si je lance mes tests séparément (c'est-à-dire, tout sauf l'onglet "tous" en mode simpletest), il n'y a pas de problème. Et quand je lance des tests "tous", j'obtiens cette erreur:

Erreur PHP inattendue [Impossible de modifier les informations d'en-tête - les en-têtes déjà envoyés par (sortie commencée à */www/public/tests/simpletest/extensions/my_reporter .php: 193)] gravité [E_WARNING] dans [* /www/system/libraries/Session.php ligne 408] Blockquote

Maintenant, je devine que tout cela utilise mon navigateur pour définir des sessions et que vous pouvez Ne pas les initialiser après le premier cas de test (dans mon cas, il y a un cas de test de modèle utilisateur qui se termine, puis le deuxième cas de test (bibliothèque d'authentification), qui a l'exception

Je devine qu'après le premier test, les en-têtes ont déjà été envoyés.

<?php 
class test_auth extends CodeIgniterUnitTestCase 
{ 

    public function __construct() 
    { 
     parent::__construct(); 

     $this->UnitTestCase('Authorization Library'); 
     $this->rand_good = rand(500,15000); 
     $this->rand_bad = rand(500,15000); 
    } 

    public function setUp() 
    { 
     $this->_ci->db->flush_cache(); 
     $this->_ci->db->truncate('users'); 
     $this->_ci->session->sess_destroy(); 
     $this->_ci->session->unset_userdata('logged_in_id'); 

     $u = new User(); 
     $u->email = 'email' . $this->rand_good; 
     $u->password = 'pass' . $this->rand_good; 
     $u->confirm_password = 'pass' . $this->rand_good; 
     $u->save(); 
    } 

    public function tearDown() 
    { 
     $u = new User(); 
     $u->get(); 
     foreach($u->all as $user) 
     { 
      $user->delete(); 
     } 
    } 

    public function test_login_good_email_good_password() 
    { 
     $u = new User(); 
     $u->email = 'email' . $this->rand_good; 
     $u->password = 'pass' . $this->rand_good; 
     $this->assertTrue($this->_ci->auth->login($u), 'login'); 
     $this->assertTrue($this->_ci->auth->is_logged_in(), 'is logged in');    
    } 

    public function test_login_bad_email_bad_password() 
    { 
     $u = new User(); 
     $u->email = 'email' . $this->rand_bad; 
     $u->password = 'pass' . $this->rand_bad; 
     $this->assertFalse($this->_ci->auth->login($u), 'login'); 
     $this->assertFalse($this->_ci->auth->is_logged_in(), 'is logged in'); 
    } 

} 

/* End of file test_auth.php */ 

Les deux lignes qui affectent ce sont les session->sess_destroy() et session->unset_userdata()

Ces lignes dans les deux tearDown() ou setUp() provoquera la même question. Chacun provoque une exception d'en-tête. Je pense que j'espère que je peux retirer le navigateur des tests et que le plus simple peut simuler cela.

Que puis-je faire pour résoudre ce problème?

+0

un peu de code pour commencer. J'imagine que si vous produisez du contenu dans votre contrôleur, ce sera la cause. Vérifiez également l'espace vide après toute fermeture? mais contrôleur de poste s'il vous plaît – Ross

+0

Il n'y a pas de contrôleur dans mon code. J'ai posté la classe de test si, cela aide. – Matthew

Répondre

0

La méthode sess_destroy() définit un nouveau cookie qui modifie les informations d'en-tête. Donc, vous devriez simplement utiliser unset_userdata() et effacer les champs que vous savez que vous devez effacer pour que le test se termine correctement. Évitez ensuite d'appeler sess_destroy() lors de vos tests.

Voir l'appel setcookie() ici: http://bitbucket.org/ellislab/codeigniter/src/c39315f13a76/system/libraries/Session.php#cl-401

+0

Droit, mais même le unset_userdata() provoque la même exception. Ma théorie est que chaque cas de test s'exécute et sort les résultats un par un, plutôt que tout à la fin, ce qui fait que le premier cas de test est celui qui contrôle les en-têtes. – Matthew

+0

Votre théorie est probablement correcte - c'était aussi ma théorie. – sholsinger