2010-10-11 7 views
6

PHPUnit :: ¿Cómo puede la función que establece y obtiene cookies, probada sin obtener error: encabezados ya enviados por?PHPUnit :: ¿Cómo puede funcionar ese conjunto y obtener cookies, probado?

Ejemplo que dan error:

PHPUnit_Framework_Error_Warning: No se puede modificar la información de cabecera - cabeceras ya enviado por

MyCookie.php

class MyCookie{ 
public static function createCookie(){ 
     $uid = null; 
     $cookieName='test_cookie'; 
     if(!isset($_COOKIE[$cookieName])){ 
      $uid = unique_hash(); 
      setcookie($cookieName, $uid, 0, '', '', false, true); 
     } 
     else{ 
      $uid=$_COOKIE[$cookieName]; 
     } 
     return $uid; 
    } 
} 

MyCookieTest.php

class MyCookieTest extends PHPUnit_Framework_TestCase{ 
    public function test_createCookie(){ 
      MyCookie::createCookie(); 
      assertThat(isset($_COOKIE['test_cookie']), is(true)); 
      unset($_COOKIE['test_cookie']); 
      MyCookie::createCookie(); 
      assertThat(isset($_COOKIE['test_cookie']), is(true)); 
    } 
} 

Gracias

+0

Por cierto, ¿tiene su propia implementación de assertThat o está utilizando una versión release candidate de PHPUnit 3.5? http://sebastian-bergmann.de/archives/896-PHPUnit-3.5-Less-this-Required.html#content –

+0

assertThat es la biblioteca de Hamcrest.php que va con phpunit – Yosef

Respuesta

3

Si su script PHP hace cualquier salida, se enviarán las cabeceras - Y no se puede establecer cookies más. Debe enviar cookies primero antes de que pueda generar cualquier HTML (u otra salida).

Si no está produciendo ningún HTML, entonces es probable que se produzca accidentalmente un espacio en blanco en algún lugar, o la marca Unicode Byte-Order. Si su editor lo admite, configúrelo para que no incluya la lista de materiales en los archivos codificados UTF-8.

Finalmente, puede usar el output buffering functions para retrasar el envío de cualquier resultado hasta que haya enviado todos sus encabezados y configurado sus cookies. (Esto no solución de salida accidental antes de que comience el almacenamiento en búfer, sin embargo)

+0

Conozco el problema, pero no cómo resuelve eso (Tus soluciones no funcionarán). Si tienes solución, escríbela. – Yosef

+0

"Mis soluciones no funcionarán" no es suficiente. _¿Por qué no? _ ¿Por qué no funcionan? ¿Qué sale mal? Seguro que funcionan bien para mí. –

+1

Para la posteridad: no funcionará porque PHPUnit escribe cosas antes de comenzar la prueba. Redirigir la salida a sdterr puede ayudar. Ver [so] (http://stackoverflow.com/questions/5505130/phpunit-output-causing-zend-session-exceptions) – Jerry