单元测试(PHPUnit):如何登录?
-
05-07-2019 - |
题
我正在使用Zend Framework为我当前的项目编写测试。 一切都很好,但我在测试已记录的用户操作/控制器时遇到问题:我需要登录才能执行操作/控制器。
如何登录PHPUnit?
解决方案
正如您所说,您想要测试操作/控制器,我想您不是在编写单元测试,而是编写功能/集成测试 - 即使用 Zend_Test
并通过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
具有此效果)并且测试依赖于静态变量。只需记住在 tearDown()
上清除静态变量( logout()
用户)。
我认为这篇文章可以帮到你: http://perevodik.net/en/posts/7/ 它描述了如何创建可用于将环境设置为与登录用户等效的状态的虚假身份。
与Pascal使用此功能的方式大致相同:
$this->_getLoginFormCSRF();
我创建了一个泛型函数,它通过使用表单元素管理器加载表单来返回值:
public function _getCSRFHashValueFromForm($ formAlias,$ csrfName){ $ form = $ this-> servicemanager-> get('FormElementManager') - > get($ formAlias); return $ form-> get($ csrfName) - > getValue(); }
这当然假定CSRF绑定到表单而不是任何字段集等。