tutorial para framework example español descargar php unit-testing phpunit output-buffering

para - phpunit laravel



Pruebe los encabezados de PHP con PHPUnit (6)

Aunque ejecutar la prueba en un proceso separado soluciona el problema, existe una sobrecarga considerable cuando se ejecuta un gran conjunto de pruebas.

Mi solución fue dirigir la salida de phpunit a stderr, así:

phpunit --stderr <options>

Eso debería solucionar el problema, y ​​también significa que no tiene que crear una función de envoltura y reemplazar todas las ocurrencias en su código.

Intento utilizar 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.

Parece que hay algo más que se envía al terminal antes de que se ejecute la prueba, aunque no haya otro archivo incluido y no haya otro personaje 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?


Como un aparte: Para mí, headers_list() mantuvo devolviendo 0 elementos. Noté el comentario de @titel sobre la pregunta y pensé que merece una mención especial aquí:

Solo quería cubrir esto si hay otras personas interesadas en esto también. headers_list() no funciona mientras se ejecuta PHPunit (que usa PHP CLI) pero en xdebug_get_headers() lugar funciona xdebug_get_headers() .

HTH


Como ya mencioné en un comentario, creo que es una mejor solución para definir processIsolation en el archivo de configuración XML como

<?xml version="1.0" encoding="UTF-8"?> <phpunit processIsolation = "true" // ... > </phpunit>

De esta manera, no tiene que pasar la opción --stderr, lo que podría irritar a sus compañeros de trabajo.


El problema es que PHPUnit imprimirá un encabezado en la pantalla y en ese punto no podrá agregar más encabezados.

El trabajo alrededor es ejecutar la prueba en un proceso aislado. Aquí hay un ejemplo

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

Esto dará como resultado:

$ phpunit FooTest.php PHPUnit 3.6.10 by Sebastian Bergmann. . Time: 1 second, Memory: 9.00Mb OK (1 test, 0 assertions)

La clave es la anotación @runInSeparateProcess.

Si está usando PHPUnit ~ 4.1 o algo similar, obtenga el error:

PHP Fatal error: Uncaught Error: Class ''PHPUnit_Util_Configuration'' not found in -:378 Stack trace: #0 {main} thrown in - on line 378 Fatal error: Uncaught Error: Class ''PHPUnit_Util_Configuration'' not found in - on line 378 Error: Class ''PHPUnit_Util_Configuration'' not found in - on line 378 Call Stack: 0.0013 582512 1. {main}() -:0

Intente agregar esto a su archivo bootstrap para solucionarlo:

<?php if (!defined(''PHPUNIT_COMPOSER_INSTALL'')) { define(''PHPUNIT_COMPOSER_INSTALL'', __DIR__ . ''/path/to/composer/vendors/dir/autoload.php''); }


Tenía una solución más radical, para usar $_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ó como un encanto. Pero creo que la solución del usuario "joonty" es la mejor de todas hasta ahora.


Una solución alternativa a @runInSeparateProcess es especificar la opción --process-isolation cuando se ejecuta PHPUnit:

name@host [~/test]# phpunit --process-isolation HeadersTest.php

Eso es análogo a establecer la opción processIsolation = "true" en phpunit.xml.

Esta solución tiene ventajas / desventajas similares a la especificación de 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 golpe de rendimiento debido a la ejecución de cada prueba en un proceso separado de PHP.