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

Ste*_*her 10 php phpunit unit-testing zend-auth zend-acl

我有一个登录后面的应用程序,并使用zend_acl和zend_auth.

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

由于应用程序完全在登录后面,因此只有在您登录时才会创建ACL.

单元测试这似乎是不可能的,或者更可能是我错过了一些明显的东西.

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

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

例如,这传递:

 public function testLoggedIn()
 {
  $this->assertTrue( Zend_Auth::getInstance()->hasIdentity() );
 }
Run Code Online (Sandbox Code Playgroud)

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

 public function testUserAccess()
 {

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

 }
Run Code Online (Sandbox Code Playgroud)

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

任何帮助非常感谢.

edo*_*ian 3

您描述的问题在使用全局变量和 OOP 全局变量(单例模式)时经常发生。

PHPUnit 的作者写了一篇文章,描述了如何通过使用依赖注入来避免这种情况,以及您还有哪些其他可能性,因为它描述性很强,所以我建议您阅读它:) http://sebastian-bergmann .de/archives/882-Testing-Code-That-Uses-Singletons.html

作为一个丑陋的替代方案(如果您需要快速结果),您可以创建一个 Zend_Auth 存根(在链接中描述)并使用 PHP 5.3 反射 API 将 Zend_Auth 实例变量设置为您的存根。

希望有帮助(因为这个问题已经持续了 4 小时而没有其他答案)