Testes de unidade PHP com Zend Auth e Zend ACL

10

Eu tenho um aplicativo que está por trás de um login e utiliza zend_acl e zend_auth.

Durante o pré-despacho, eu tenho um plugin ACL que cria todas as regras para a ACL. Eu também tenho um plugin Auth que verifica se você está logado ou não e, em caso afirmativo, se você tem acesso ao recurso solicitado de acordo com a ACL.

Como o aplicativo está totalmente atrás de um login, o ACL é criado apenas se você estiver logado.

Testes unitários parecem impossíveis, ou melhor, eu estou sentindo falta de algo óbvio.

No meu método de configuração de teste de unidade, simulo um login bem-sucedido que retorna uma instância de zend_auth. Testes que são aprovados indicam que esse login foi bem-sucedido.

No entanto, se eu, por meio de testes, tentar enviar para outro local, ou avaliar se o usuário conectado tem acesso a um determinado recurso, ele será sempre rejeitado pelo plug-in, pois ainda não estão conectados. por que isso é, alguém pode aconselhar?

Por exemplo, isso passa:

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

Isso falha, pois é rejeitado pelo plug-in:

 public function testUserAccess()
 {

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

 }

Isto, eu descobri ainda parece estar redirecionando de volta para a página de login como os plugins não sabem que o usuário está logado.

Qualquer ajuda muito apreciada.

    
por Stephen Maher 28.07.2010 в 13:38
fonte

2 respostas

3

O problema que você descreve acontece muito com o uso de variáveis globais e a variável global OOP (o Padrão Singleton).

Existe um artigo do autor do PHPUnit que descreve como você pode evitar isso usando a Injeção de Dependência e quais outras possibilidades você tem e como é muito descritivo, eu sugiro que você o leia :) link

Como uma alternativa feia (se você precisar de um resultado rápido) você pode criar um esboço de Zend_Auth (descreva no link) e use a API de reflexão do PHP 5.3 para definir a variável de instância Zend_Auth como seu stub.

Espero que ajude (como a questão viveu 4h sem outra resposta)

    
por edorian 28.07.2010 / 18:00
fonte
4

Aqui está outra maneira de criar um stub para substituir seu plug-in do ACL (ou qualquer plugin) durante o teste. Coloque isso no seu ControllerTestCase e chame-o no setUp do caso de teste.

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); 
}

Dessa forma, seu método stub preDispatch é chamado, o que ignora suas verificações de controle de acesso reais.

    
por alex.catalyst 30.01.2012 / 11:01
fonte