2012-03-20 3 views
0

Lorsque de reprise en utilisant le plug-in Eclipse pour de reprise en exécuter un test qui définit les en-têtes, je reçois:déjà envoyés en-têtes lorsque vous utilisez le plugin

Cannot modify header information - headers already sent by (output started at C:\wamp\bin\php\php5.3.8\pear\PHPUnit\Util\Printer.php:173) 

Ce même test fonctionne très bien quand je le lance à travers Phing. Je suppose que Phing définit la sortie sur stderr car lorsque j'exécute le même test depuis la ligne de commande phpunit avec le commutateur --stderr, cela fonctionne correctement. Il échoue de la même manière qu'avec MakeGood sans le commutateur --stderr.

Y at-il un moyen de contourner cela, ou un moyen de définir la sortie de stderr dans le plugin MakeGood?

En outre, cela ne devrait pas faire de différence, mais cela est un projet Zend Framework et je l'ai mis

Zend_Session::$_unitTestEnabled = true; 

dans mon bootstrap de test.

Répondre

2

Le problème est que PHPUnit va imprimer un en-tête à l'écran et à ce point PHP ne peut plus envoyer d'en-têtes.

Le travail consiste à exécuter le test dans un processus isolé. Voici un exemple

<?php 

class FooTest extends PHPUnit_Framework_TestCase 
{ 
    /** 
    * @runInSeparateProcess 
    */ 
    public function testBar() 
    { 
     header('Location : http://foo.com'); 
    } 
} 

Cela se traduira par:

$ phpunit FooTest.php 
PHPUnit 3.6.10 by Sebastian Bergmann. 

. 

Time: 1 second, Memory: 9.00Mb 

OK (1 test, 0 assertions) 

La clé est l'annotation @runInSeparateProcess.

Vous pouvez également utiliser l'indicateur --process-isolation lors de l'exécution de PHPUnit.

Si vous écrivez du code autour de Zend Framework, vous ne devriez pas utiliser header() directement. Vous devriez utiliser Zend_Http_Response.

De plus, si vous faites des tests de niveau MVC, je vous suggère de regarder Zend_Test_PHPUnit.

+0

merci pour la réponse. Malheureusement, l'utilisation de l'annotation '@ runInSeparateProcess' et/ou de l'indicateur --process-isolation fait que MakeGood reste là à ne rien faire. La seule sortie de console est PHPUnit 3.5.15 de Sebastian Bergmann. J'utilise actuellement Zend_Test_PHPUnit. Vous ne savez pas ce que vous voulez dire en utilisant Zend_Http_Response. Voici l'action de mon contrôleur. fonction publique robotsAction() {header ('Content-type: text/plain'); $ this -> _ helper-> layout() -> disableLayout(); } – Luke

+1

Essayez de remplacer votre appel à header() par ** $ this-> getResponse() -> setHeader ('Content-type', 'text/plain'); ** – SamHennessy

+0

Merci beaucoup! MakeGood est heureux maintenant, et merci pour l'astuce à propos de Zend_Http_Response. :) – Luke

Questions connexes