2010-07-28 15 views
9

Tengo una aplicación que está detrás de un inicio de sesión y utiliza zend_acl y zend_auth.Prueba de unidades PHP con Zend Auth y Zend ACL

Durante el pre-envío tengo un complemento de ACL que crea todas las reglas para la ACL. También tengo un complemento Auth que comprueba si ha iniciado sesión o no y, de ser así, si tiene acceso al recurso solicitado de acuerdo con la ACL.

Como la aplicación es totalmente detrás de una entrada de la ACL sólo se crea si está conectado.

Prueba de la unidad esto parece ser imposible, o más bien es más probable que me falta algo obvio.

En mi método de configuración de prueba unitaria, simulo un inicio de sesión exitoso que devuelve una instancia de zend_auth. Las pruebas que pasan indican que este inicio de sesión fue exitoso.

Sin embargo, si después de las pruebas intento enviar a otra ubicación, o evaluar si el usuario conectado tiene acceso a un recurso determinado, siempre es rechazado por el complemento ya que todavía no están conectados. No estoy seguro de por qué es esto, ¿alguien puede aconsejar?

Por ejemplo, esto pasa:

public function testLoggedIn() 
{ 
    $this->assertTrue(Zend_Auth::getInstance()->hasIdentity()); 
} 

Esta falla, ya que es rechazado por el plugin:

public function testUserAccess() 
{ 

    $this->dispatch('/home'); 
      $this->assertResponseCode(200); 
      $this->assertQueryContentContains('#nav_side'); 
      $this->resetRequest() 
      ->resetResponse(); 

} 

Esto, he encontrado todavía parece ser redirigidos a la página de inicio de sesión como los plugins no sé si el usuario está conectado.

Cualquier ayuda muy apreciada.

Respuesta

3

El problema que describe ocurre mucho con el uso de variables globales y la variable global OOP (el patrón Singleton).

Hay un artículo por el autor de PHPUnit que describe cómo se puede evitar que mediante el uso de la inyección de dependencias y qué otras posibilidades que tienes y ya que es muy descriptivo, sólo sugiero que lo leas :) http://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html

Como una alternativa fea (si necesita un resultado rápido) puede crear un stub de Zend_Auth (descríbalo en el enlace) y usar la API de reflexión PHP 5.3 para establecer la variable de instancia Zend_Auth en su stub.

Esperanza que ayuda (como la cuestión vivió 4h sin otra respuesta)

+0

Sí, gracias ese parece ser el problema. –

2

Aquí es otra manera de crear un talón para reemplazar su ACL Plugin (o cualquier plug-in) durante la prueba. Pon esto en tu ControllerTestCase y llámalo en el caso de prueba setUp.

public function doLogin() 
{ 
    // create a fake identity 
    $identity = new stdClass(); 
    $identity->Username = 'PHPUnit'; 
    Zend_Auth::getInstance()->getStorage()->write($identity); 

    // remove the autoloaded plugin 
    $front = Zend_Controller_Front::getInstance(); 
    $front->unregisterPlugin('My_Controller_Plugin_Acl'); 

    // create the stub for the Acl class 
    $mockaAcl = $this->getMock(
     'My_Controller_Plugin_Acl', 
     array('preDispatch'), 
     array(), 
     'My_Controller_Plugin_AclMock' 
    ); 

    // register the stub acl plugin in its place 
    $front->registerPlugin($mockAcl); 
} 

De esta manera el método talón de preDispatch se llama en cambio, que pasará por alto sus cheques reales de control de acceso.