J'essaie d'utiliser PHPunit pour tester une classe qui génère des en-têtes personnalisés.
Le problème est que sur ma machine ceci:
<?php
class HeadersTest extends PHPUnit_Framework_TestCase {
public function testHeaders()
{
ob_start();
header('Location: foo');
$headers_list = headers_list();
header_remove();
ob_clean();
$this->assertContains('Location: foo', $headers_list);
}
}
ou même ceci:
<?php
class HeadersTest extends PHPUnit_Framework_TestCase {
public function testHeaders()
{
ob_start();
header('Location: foo');
header_remove();
ob_clean();
}
}
renvoyer cette erreur:
name@host [~/test]# phpunit --verbose HeadersTest.php
PHPUnit 3.6.10 by Sebastian Bergmann.
E
Time: 0 seconds, Memory: 2.25Mb
There was 1 error:
1) HeadersTest::testHeaders
Cannot modify header information - headers already sent by (output started at /usr/local/lib/php/PHPUnit/Util/Printer.php:173)
/test/HeadersTest.php:9
FAILURES!
Tests: 1, Assertions: 0, Errors: 1.
Cela ressemble à quelque chose d'autre sortant vers le terminal avant l'exécution du test, même s'il n'y a pas d'autre fichier inclus et qu'il n'y a pas d'autre caractère avant le début de la balise PHP. Cela pourrait-il être quelque chose à l'intérieur de PHPunit?
Quel pourrait être le problème?
Réponses:
Le problème est que PHPUnit imprimera un en-tête à l'écran et à ce stade, vous ne pouvez pas ajouter plus d'en-têtes.
La solution consiste à exécuter le test dans un processus isolé. Voici un exemple
Cela se traduira par:
La clé est l'annotation @runInSeparateProcess.
Si vous utilisez PHPUnit ~ 4.1 ou quelque chose et obtenez l'erreur:
Essayez d'ajouter ceci à votre fichier d'amorçage pour le réparer:
la source
PHP Fatal error: Uncaught exception 'Exception' with message 'Serialization of 'SplFileInfo' is not allowed' in phar:///usr/local/bin/phpunit/phpunit/Util/GlobalState.php:211
Bien que l'exécution du test dans un processus séparé résout le problème, il y a une surcharge notable lors de l'exécution d'une grande suite de tests.
Mon correctif était de diriger la sortie de phpunit vers stderr, comme ceci:
Cela devrait résoudre le problème, et cela signifie également que vous n'avez pas à créer une fonction wrapper et à remplacer toutes les occurrences de votre code.
la source
stderr="true"
votre phpunit.xml pour enregistrer quelques frappes.En aparté: pour moi, j'ai
headers_list()
continué à retourner 0 éléments. J'ai remarqué le commentaire de @titel sur la question et j'ai pensé qu'il méritait une mention spéciale ici:HTH
la source
Comme déjà mentionné dans un commentaire, je pense que c'est une meilleure solution pour définir processIsolation dans le fichier de configuration XML comme
Comme ça, vous n'avez pas à passer l'option --stderr, ce qui pourrait irriter vos collègues.
la source
J'avais une solution plus radicale, afin de l'utiliser
$_SESSION
dans mes fichiers testés / inclus . J'ai édité l'un des fichiers PHPUnit sur ../PHPUnit/Utils/Printer.php pour avoir un"session_start();"
avant la commande "print $ buffer" .Cela a fonctionné pour moi comme un charme. Mais je pense que la solution de l'utilisateur "joonty" est la meilleure de toutes jusqu'à présent.
la source
Une solution alternative à @runInSeparateProcess consiste à spécifier l'option --process-isolation lors de l'exécution de PHPUnit:
Cela revient à définir l'option processIsolation = "true" dans phpunit.xml.
Cette solution présente des avantages / inconvénients similaires à ceux de la spécification de l'option --stderr, qui n'a cependant pas fonctionné dans mon cas. Fondamentalement, aucune modification de code n'est nécessaire, même s'il peut y avoir un problème de performance en raison de l'exécution de chaque test dans un processus PHP distinct.
la source
Utilisez le paramètre --stderr pour obtenir les en-têtes de PHPUnit après vos tests.
la source