2010-06-16 19 views
9

Con PHPUnit es bastante fácil probar el código PHP sin procesar, pero ¿qué pasa con el código que se basa en gran medida en las cookies? Las sesiones podrían ser un buen ejemplo.Usando PHPUnit para probar cookies y sesiones, ¿cómo?

¿Hay algún método que no requiera que configure $_COOKIE con datos durante mi prueba? Se siente como una forma hacky de hacer las cosas.

+0

¿Puedes elaborar en hacky? ¿Podrías simplemente 'desarmar ($ _ COOKIE)' en el 'setUp' de la prueba? –

+0

Realmente no quiero lidiar con eso en mis pruebas. Siento que es un desorden innecesario y debería tratarse automáticamente. –

Respuesta

5

Este es un problema común con el código, especialmente con el código PHP antiguo. La técnica común utilizada es abstraer aún más las variables COOKIE/SESSION en objetos relacionados y usar la (s) técnica (s) de control de inversión para llevar esas dependencias a un ámbito.

http://martinfowler.com/articles/injection.html

Ahora antes de ejecutar una prueba que le instanciar una versión simulada de un objeto de la galleta/sesión y proporcionar datos por defecto.

Imagino que se puede lograr el mismo efecto con el código heredado simplemente anulando el valor súper global antes de ejecutar la prueba.

Saludos, Alex

2

Entiendo que esto es bastante viejo, pero yo creo que esto tiene que ser actualizado como la tecnología ha mejorado desde el post original. Yo era capaz de conseguir sesiones de trabajo con esta solución usando PHP 5.4 con PHPUnit 3.7:

class UserTest extends \PHPUnit_Framework_TestCase { 
    //.... 
    public function __construct() { 
     ob_start(); 
    } 

    protected function setUp() { 
     $this->object = new \User(); 
    } 

    public function testUserLogin() { 
     $this->object->setUsername('test'); 
     $this->object->setPassword('testpw'); 
     // sets the session within: 
     $this->assertEquals(true, $this->object->login()); 
    } 
} 
+1

Investigaciones adicionales me han llevado a la (en mi mente) correcta implementación del buffering de salida como una anotación: @outputBuffering habilitado Pon esto en los comentarios de la función y se ocupa del problema del almacenamiento en búfer. – Etrahkad

0

me di cuenta que podía usar PHPUnit para probar el comportamiento de la parte de mi sitio web que se basa en gran medida en las sesiones, a través de una combinación de Curl y cookie que pasa la identificación de la sesión .

La siguiente clase Curl utiliza la opción CURLOPT_COOKIE para pasar un parámetro de sesión. La variable estática $sessionid guarda la sesión entre diferentes llamadas Curl. Además, las sesiones se pueden cambiar usando la función estática changeSession.

class Curl { 
    private $ch; 
    private static $sessionid; 

    public function __construct($url, $options) { 
     $this->ch = curl_init($url); 

     if (!self::$sessionid) 
      self::$sessionid = .. generateRandomString() ..; 

     $options = $options + array(
      CURLOPT_RETURNTRANSFER => true, 
      CURLOPT_COOKIE => 'PHPSESSID=' . self::$sessionid); 

     foreach ($options as $key => $val) { 
      curl_setopt($this->ch, $key, $val); 
     } 
    } 

    public function getResponse() { 
     if ($this->response) { 
      return $this->response; 
     } 

     $response = curl_exec($this->ch); 
     $error = curl_error($this->ch); 
     $errno = curl_errno($this->ch); 
     $header_size = curl_getinfo($this->ch, CURLINFO_HEADER_SIZE); 
     $this->header = substr($response, 0, $header_size); 
     $response = substr($response, $header_size); 

     if (is_resource($this->ch)) { 
      curl_close($this->ch); 
     } 

     if (0 !== $errno) { 
      throw new \RuntimeException($error, $errno); 
     } 

     return $this->response = $response; 
    } 

    public function __toString() { 
     return $this->getResponse(); 
    } 

    public static function changeSession() { 
     self::$SESSIONID = Practicalia::generateRandomString(); 
    } 
} 

Un ejemplo de llamada

$data = array(
    'action' => 'someaction', 
    'info' => 'someinfo' 
); 

$curl = new Curl(
    'http://localhost/somephp.php', 
    array(
     CURLOPT_POSTFIELDS => http_build_query($data))); 

$response = $curl->getResponse(); 

y cualquier llamada Curl subsiguientes se utilizará automáticamente la misma sesión que la anterior, a menos que específicamente se llama Curl::changeSession().

Cuestiones relacionadas