4

我正在为我当前的项目编写测试,使用 Zend 框架。一切都很好,但我在测试登录的用户操作/控制器时遇到问题:我需要登录才能执行操作/控制器。

如何登录 PHPUnit?

4

4 回答 4

7

正如您所说的要测试动作/控制器,我想您不是在编写单元测试,而是在编写功能/集成测试——即,使用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 令牌、填充表单并发布它。

然后,我可以测试我是否已连接。


有了它,您可能可以提取登录部分,在每个需要有效用户登录的测试之前调用它。

于 2009-11-27T11:19:03.170 回答
1

还有另一种方法。在我的User实体上,我有一个login()方法可以将用户的 id 放入会话和一个静态变量中。我只是在测试中做的setUp()是调用$user->login()并且它有效。在测试环境中不使用会话(设置Zend_Session::$isUnitTested = true具有此效果)并且测试依赖于静态变量。只要记住清除上的静态变量(logout()用户)tearDown()

于 2009-11-27T11:33:40.830 回答
1

我认为这篇文章可以帮助您: http: //perevodik.net/en/posts/7/ 它描述了如何创建一个假身份,您可以使用该身份将环境设置为相当于用户登录的状态。

于 2010-10-27T10:30:35.537 回答
0

与 Pascal 使用此函数的方式大致相同:

$this->_getLoginFormCSRF();

我创建了一个通用函数,它通过使用表单元素管理器加载表单来返回值:

公共函数 _getCSRFHashValueFromForm($formAlias, $csrfName) { $form = $this->servicemanager->get('FormElementManager')->get($formAlias); 返回 $form->get($csrfName)->getValue(); }

这当然假设 CSRF 绑定到表单而不是任何字段集等。

于 2013-09-10T19:48:49.920 回答