Estoy tratando de usar PHPunit para probar una clase que genera algunos encabezados personalizados.
El problema es que en mi máquina esto:
<?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);
}
}
o incluso esto:
<?php
class HeadersTest extends PHPUnit_Framework_TestCase {
public function testHeaders()
{
ob_start();
header('Location: foo');
header_remove();
ob_clean();
}
}
devuelve este error:
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.
Esto parece como si hubiera algo más saliendo en la terminal antes de que se ejecute la prueba, aunque no hay ningún otro archivo incluido y no hay ningún otro carácter antes del comienzo de la etiqueta PHP. ¿Podría ser algo dentro de PHPunit lo que está causando esto?
¿Cuál podría ser el problema?
php
unit-testing
phpunit
output-buffering
título
fuente
fuente
Respuestas:
El problema es que PHPUnit imprimirá un encabezado en la pantalla y en ese momento no podrá agregar más encabezados.
La solución consiste en ejecutar la prueba en un proceso aislado. Aquí hay un ejemplo
Esto resultará en:
La clave es la anotación @runInSeparateProcess.
Si está utilizando PHPUnit ~ 4.1 o algo y obtiene el error:
Intente agregar esto a su archivo de arranque para solucionarlo:
fuente
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
Aunque ejecutar la prueba en un proceso separado soluciona el problema, hay una sobrecarga notable cuando se ejecuta un gran conjunto de pruebas.
Mi solución fue dirigir la salida de phpunit a stderr, así:
Eso debería solucionar el problema y también significa que no tiene que crear una función contenedora y reemplazar todas las apariciones en su código.
fuente
stderr="true"
su phpunit.xml para ahorrar algunas pulsaciones de teclas.Como comentario al margen: para mí
headers_list()
seguía devolviendo 0 elementos. Noté el comentario de @titel sobre la pregunta y pensé que merece una mención especial aquí:HTH
fuente
Como ya se mencionó en un comentario, creo que es una mejor solución para definir processIsolation en el archivo de configuración XML como
De esta manera, no tiene que pasar la opción --stderr, lo que podría irritar a sus compañeros de trabajo.
fuente
Tenía una solución más radical, para usarla
$_SESSION
dentro de mis archivos probados / incluidos . Edité uno de los archivos PHPUnit en ../PHPUnit/Utils/Printer.php para tener un"session_start();"
antes del comando "print $ buffer" .Me funcionó a las mil maravillas. Pero creo que la solución del usuario "joonty" es la mejor de todas hasta ahora.
fuente
Una solución alternativa a @runInSeparateProcess es especificar la opción --process-aislamiento al ejecutar PHPUnit:
Eso es análogo a establecer la opción processIsolation = "true" en phpunit.xml.
Esta solución tiene ventajas / desventajas similares a las de especificar la opción --stderr, que sin embargo no funcionó en mi caso. Básicamente, no son necesarios cambios de código, aunque puede haber un impacto en el rendimiento debido a la ejecución de cada prueba en un proceso PHP separado.
fuente
Use el parámetro --stderr para obtener encabezados de PHPUnit después de sus pruebas.
fuente