gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 22:49:07 24 4
gpt4 key购买 nike

我有一个需要登录并使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com