2012-02-03 8 views
10

Tengo una prueba de unidad que falla porque los encabezados ya están enviados. Sin embargo, se espera el encabezado en este escenario.¿Cómo probar los encabezados esperados?

¿Cómo le digo a PHPUnit que espere un encabezado 500?

He leído this question pero no ayudó.

El método está envuelto dentro de un búfer de salida.

ob_start(); 
$foo->methodWhichSendsHeader(); 
ob_clean(); 
+1

¿Está seguro de que [esta respuesta] (http://stackoverflow.com/a/190498/212940) no es correcta para su caso? – vascowhite

Respuesta

19

Si ha instalado XDebug puede utilizar xdebug_get_headers() para obtener las cabeceras. Entonces puedes probarlos según sea necesario.

$headers=xdebug_get_headers(); 

se obtiene una matriz que se parece a ...

array(
    0 => "Content-type: text/html", 
    1 => ... 
) 

por lo que tendrá que analizar cada línea de cabecera para separar el nombre de cabeza desde el valor

+0

Esto funciona muy bien para llamadas del formato 'header ('Content-Type: text/html');' pero no parece funcionar para llamadas del formato 'header ('HTTP/1.1 500 Internal Server Error '); ' ¿Hay alguna forma de obtener estos encabezados/códigos de estado? – Derokorian

+0

Si bien no puede obtener el contenido del encabezado real del 'encabezado ('HTTP/1.1 500 Internal Server Error');', usted * puede * usar el [http_response_code()] (http://php.net) incorporado. /manual/en/function.http-response-code.php) para recuperar el código de estado HTTP que se devolverá al navegador. – JSmitty

2

Si se puede' t use xdebug_get_headers en su sistema, otro enfoque es simular la función de encabezado.

Estoy usando lo siguiente ahora, que funciona muy bien. Digamos que tiene este código ...

<?php 
header('Content-type: text/plain; charset=UTF-8'); 
... 

sustituyo header con una función de cabecera, que es comprobable como esto ...

<?php 
Testable::header('Content-type: text/plain; charset=UTF-8'); 
... 

La clase comprobable se implementa de la siguiente manera. Tenga en cuenta que las funciones solo deben ir precedidas de Testable::. De lo contrario, funcionan igual que las funciones habituales.

class Testable { 
    private static $headers=array(); 

    static function header($header) { 
     if (defined('UNIT_TESTING')) { 
     self::$headers[]=$header; 
     } else { 
     header($header); 
     } 
    } 

    public static function reset() { 
     self::$headers=array(); 
    } 

    public static function headers_list() { 
     if (defined('UNIT_TESTING')) { 
      return self::$headers; 
     } else { 
      return headers_list(); 
     } 
    } 
} 

Ahora todo lo que necesita hacer es definir UNIT_TESTING en sus pruebas, pero no en la producción. Luego, cuando vengas a probar tus encabezados, simplemente llama al Testable::headers_list().

Por supuesto, debe agregar métodos para setcookie, headers_sent y cualquier otra función que emita encabezados HTTP.

+4

Sí, pero esto modifica el tema de la prueba. Eso no es bueno. –

+0

@JimmyKane - No más que cualquier simulacro, por lo que yo sé. Puede dejar la llamada al encabezado Testable :: en el código de producción, siempre que en la producción UNIT_TESTING no esté definida. ¿Hay algo que me falta aquí? –

+1

Lo que quiero decir es que tienes que agregar una función estática a tu clase y así modificar la clase 'Testable'. No quiero editar y agregar una estática en cada resumen que envíe encabezados para que se pueda probar. Pero eso es solo una preferencia. Aparte de eso, tu respuesta es buena. Que tengas un gran día. –

Cuestiones relacionadas