php zend-framework phpunit zend-session

Salida PHPUnit que causa excepciones Zend_Session



zend-framework zend-session (5)

Estoy recibiendo numerosos errores exactamente como este:

Zend_Session_Exception: Session must be started before any output has been sent to the browser; output started in /usr/local/zend/share/pear/PHPUnit/Util/Printer.php/173

Cuando ejecuto el conjunto de pruebas de mi aplicación. Esto es con PHPUnit 3.5.10 y PHP 5.3.5.

No hay salida de espacios en blanco misteriosa e inesperada que está causando esto. He determinado que la "salida que se envía al navegador" es el resultado real de las pruebas PHPUnit que se están ejecutando. Si abro PHPUnit / Util / Printer.php y envuelvo la línea print $buffer con if (strpos($buffer, ''PHPUnit 3.5.10 by Sebastian Bergmann'') === false) (deteniendo efectivamente la primera línea de salida desde PHPUnit), entonces mi primera prueba tiene éxito (hasta que el caso de prueba da como resultado un punto que indica que la prueba tuvo éxito, entonces la siguiente prueba falla porque salió el punto).

Otro desarrollador de mi equipo puede ejecutar el conjunto de pruebas completo con éxito, así que sé que no es un problema con el código de la aplicación. Debe ser algún ajuste de configuración o problema con mi entorno local.

Ya revisé php.ini para verificar que output_buffering esté activado y implicit_flush esté desactivado, y lo están.

También intenté agregar Zend_Session::$_unitTestEnabled = true; para mi bootstrap de prueba, pero eso no ayudó (y no debería ser necesario de todos modos, ya que funciona en la máquina de otro desarrollador y en nuestro servidor de CI sin él).

¿Alguna sugerencia además de ignorar los errores? Nunca había visto algo como esto y estoy realmente perdido.

¡Gracias!

ACTUALIZAR:

Para intentar aislar aún más el problema, saqué ZF y mi aplicación de la ecuación al ejecutar el siguiente script de prueba:

<?php class SessionTest extends PHPUnit_Framework_TestCase { public function testSession() { session_start(); $this->assertTrue(true); } }

La prueba falla:

1) SessionTest::testSession session_start(): Cannot send session cookie - headers already sent by (output started at /home/mmsa/test.php:1)

Sin embargo, la misma prueba funciona en la máquina de un amigo. La misma versión de PHP y PHPUnit.


Como dijo , solo necesitas agregar esto en tu bootstrap.php

Zend_Session::$_unitTestEnabled = true;

En mi caso, puse algo como en mi archivo bootstrap.php

if(APPLICATION_ENV == ''testing'' && php_sapi_name() == ''cli'') { Zend_Session::$_unitTestEnabled = true; }

Entonces no tienes que cambiarlo más.


Creo que es mejor usar

Zend_Session::$_unitTestEnabled = true;

Usar esto en mi arranque de pruebas previene este error.


Ejecute phpunit con el indicador -stderr, (las versiones más nuevas pueden usar --stderr en su lugar), por ejemplo

phpunit -stderr mytest.php # or phpunit --stderr mytest.php

Esto dirige la salida de phpunit a stderr, evitando que interrumpa la generación del encabezado HTTP.

Es posible que la prueba funcione en la máquina de tu amigo porque tiene habilitado el almacenamiento en búfer de salida (aunque no estoy seguro de si eso es relevante en un contexto de CLI).


Si el binario php utilizado por PHPUnit en su sistema es el CGI en lugar de la versión CLI, entonces session_start realmente intentará establecer cookies y obtendrá ese error.

Puede verificar para asegurarse de qué SAPI está usando llamando a php_sapi_name .


Tuve el mismo problema con otro proyecto, y descubrí que el problema era que PHPUnit causaba que la salida se iniciara demasiado pronto, ya que genera un mensaje de bienvenida antes de ejecutar la prueba.

Se agregaron las siguientes dos líneas a bootstrap.php :

ini_set(''session.use_cookies'', 0); ini_set(''session.cache_limiter'', '''');

Esto debería evitar que los encabezados se envíen antes de que se ejecute el conjunto de pruebas.