我正在为我当前的项目编写测试,使用 Zend 框架。一切都很好,但我在测试登录的用户操作/控制器时遇到问题:我需要登录才能执行操作/控制器。
如何登录 PHPUnit?
我正在为我当前的项目编写测试,使用 Zend 框架。一切都很好,但我在测试登录的用户操作/控制器时遇到问题:我需要登录才能执行操作/控制器。
如何登录 PHPUnit?
正如您所说的要测试动作/控制器,我想您不是在编写单元测试,而是在编写功能/集成测试——即,使用Zend_TestMVC 并通过 MVC 进行测试。
这是我在项目中使用的测试功能,我正在测试登录是否正常:
public function testLoggingInShouldBeOk()
{
$this->dispatch('/login/login');
$csrf = $this->_getLoginFormCSRF();
$this->resetResponse();
$this->request->setPost(array(
'login' => 'LOGIN',
'password' => 'PASSWORD',
'csrfLogin' => $csrf,
'ok' => 'Login',
));
$this->request->setMethod('POST');
$this->dispatch('/login/login');
$this->assertRedirectTo('/');
$this->assertTrue(Zend_Auth::getInstance()->hasIdentity());
}
很简单:我正在加载登录表单、提取 CSRF 令牌、填充表单并发布它。
然后,我可以测试我是否已连接。
有了它,您可能可以提取登录部分,在每个需要有效用户登录的测试之前调用它。
还有另一种方法。在我的User实体上,我有一个login()方法可以将用户的 id 放入会话和一个静态变量中。我只是在测试中做的setUp()是调用$user->login()并且它有效。在测试环境中不使用会话(设置Zend_Session::$isUnitTested = true具有此效果)并且测试依赖于静态变量。只要记住清除上的静态变量(logout()用户)tearDown()。
我认为这篇文章可以帮助您: http: //perevodik.net/en/posts/7/ 它描述了如何创建一个假身份,您可以使用该身份将环境设置为相当于用户登录的状态。
与 Pascal 使用此函数的方式大致相同:
$this->_getLoginFormCSRF();
我创建了一个通用函数,它通过使用表单元素管理器加载表单来返回值:
公共函数 _getCSRFHashValueFromForm($formAlias, $csrfName) { $form = $this->servicemanager->get('FormElementManager')->get($formAlias); 返回 $form->get($csrfName)->getValue(); }
这当然假设 CSRF 绑定到表单而不是任何字段集等。