2011-03-31 13 views
26

estoy recibiendo numerosos errores exactamente como éste:salida PHPUnit que causan excepciones Zend_Session

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 se ejecuta conjunto de pruebas de mi solicitud. Esto es con PHPUnit 3.5.10 y PHP 5.3.5.

No hay salida de espacio 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 de PHPUnit), entonces mi primera prueba tiene éxito (hasta que el caso de prueba muestra 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 hay ningún problema con el código de la aplicación. Debe ser algún ajuste de configuración o problema con mi entorno local.

Ya he comprobado php.ini para verificar que output_buffering está encendido y implicit_flush está desactivado, y lo son.

También intenté agregar Zend_Session::$_unitTestEnabled = true; a mi bootstrap de prueba, pero eso no ayudó (y no debería ser necesario porque 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!

ACTUALIZACIÓN:

Para intentar aislar aún más el problema, me tomó ZF y mi solicitud fuera de la ecuación ejecutando 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.

Respuesta

37

Ejecute phpunit con el distintivo -stderr, (las versiones más nuevas pueden usar --stderr en su lugar), p.

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 su 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).

+0

Haga caso omiso de mi comentario anterior; esto en realidad ** funcionó **. Todavía tenía un código de depuración en el núcleo de PHPUnit mientras intentaba resolver esto anoche. Cuando lo revertí, el indicador '--stderr' permitió que las pruebas funcionaran. ¡Gracias! Esta es una solución, sin embargo. Si funciona en otra máquina sin la bandera '--stderr', entonces debería funcionar en la mía. Por lo que puedo decir, no tengo el búfer de salida desactivado. ¿Qué más puedo verificar? –

+1

Es posible que sea '--stderr' en las últimas versiones (que sin duda sería más estándar), pero mi (un poco fuera de fecha) de instalar PHPUnit sólo es compatible con' -stderr'. Usamos '-stderr' cuando ejecutamos todas nuestras pruebas, debido a este problema de sesión. En cuanto a lo que podría diferir entre sus entornos, solo puedo recomendar comparar la salida de 'php -i' en ambas máquinas para encontrar las diferencias de configuración. –

+1

Esto también funciona para mí. Lamentablemente, no parece haber una opción (todavía) para poner 'phpunit.xml' para esto. – dave1010

1

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á utilizando llamando al php_sapi_name.

+0

'eco php_sapi_name();' salidas "cli" –

+0

La única otra cosa que diría que la parte superior de la cabeza es para asegurarse de que 'config-show de pera | grep php_bin' enumera el mismo binario que estás esperando. –

+0

Señala a '/ usr/local/zend/bin/php', que es la única instalación de PHP en mi entorno. –

6

creo que mejor forma de hacerlo es utilizar

Zend_Session::$_unitTestEnabled = true; 

El uso de este en mi rutina de carga de prueba impide este error.

0

tuve el mismo problema con otro proyecto, y me pareció que el tema se PHPUnit causando salida para iniciar demasiado pronto, ya que da salida a su mensaje de bienvenida antes de ejecutar la prueba.

añaden los siguientes dos líneas a bootstrap.php:

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

Esto debe evitar que los encabezados de ser enviado antes de que sus carreras serie de pruebas.

0

Como Makor Dicho esto, sólo tiene que añadir esto en su Bootstrap.php

Zend_Session::$_unitTestEnabled = true; 

En mi caso, puse algo así en mi Bootstrap.php archivo

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

Para que no tenga que volver a cambiarlo.

Cuestiones relacionadas