使用 Zend Auth 和 Zend ACL 进行 PHP 单元测试

标签 php unit-testing phpunit zend-auth zend-acl

我有一个需要登录并使用 zend_acl 和 zend_auth 的应用程序。

在预调度期间,我有一个 ACL 插件,可以为 ACL 创建所有规则。我还有一个 Auth 插件,用于检查您是否已登录,如果已登录,您是否有权根据 ACL 访问所请求的资源。

由于该应用程序完全需要登录,因此只有在您登录后才会创建 ACL。

单元测试这似乎是不可能的,或者更有可能是我遗漏了一些明显的东西。

在我的单元测试设置方法中,我模拟了一个返回 zend_auth 实例的成功登录。通过的测试表明此登录成功。

但是,如果我随后通过测试尝试分派(dispatch)到另一个位置,或者评估登录用户是否可以访问给定资源,它总是被插件拒绝,因为他们仍然没有登录。我不确定这是为什么,有人可以建议吗?

例如这个通过:

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

这失败了,因为它被插件拒绝了:

 public function testUserAccess()
 {

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

 }

我发现这似乎仍然会重定向回登录页面,因为插件不知道用户已登录。

非常感谢任何帮助。

最佳答案

这是另一种创建 stub 以在测试期间替换 ACL 插件(或任何插件)的方法。将其放入您的 ControllerTestCase 并在测试用例设置中调用它。

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

通过这种方式,您的 stub preDispatch 方法将被调用,这将绕过您的实际访问控制检查。

关于使用 Zend Auth 和 Zend ACL 进行 PHP 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3352425/

相关文章:

PHPUnit 使用数据集测试方法中的选择

php - 使用 composer.json 中定义的 Composer 脚本,如何显示 phpunit 颜色?

unit-testing - 如何对数据结构的内部(组织)进行单元测试?

php - 重力形式 : Dynamically create set of fields

php - 如何在 PHP 中使用正则表达式解析 Apache 日志

php - imagick 模块问题 - PHP

c++ - 未显示测试结果的 Web-CAT CxxTest Eclipse GUI

php - Laravel 5.2 单元测试集标题不起作用

PHPUnit、接口(interface)和命名空间 (Symfony2)

PHP 错误 : Call to a member function rowCount() on a non-object