Zend Framework 1.11,Doctrine2 - 如何在不刷新数据库的情况下测试控制器

时间:2012-02-21 19:03:01

标签: zend-framework doctrine controller phpunit

我使用ZF 1.11设置了doctrine2,我很难学习单元测试控制器的最佳方法。我希望能够在我的单元测试中测试控制器中的操作而无需写入数据库,但我发现实际上无法实现。

例如说我在我的控制器中有以下假设动作。

public function redirectUserAction() {
    $registry = Zend_Registry::getInstance();
    $em = $registry->entitymanager;
    $user = $em->getRepository('Application_Model_User')
               ->findOneBy(array('email' => 'test@test.com'));
    if(is_object($user)) {
        $this->_redirect('/');
    }
}

我想测试一下,如果有一个用户可以使用电子邮件地址test@test.com,那么在我进行以下测试时,它会重定向到/。

public function testUserAvaliableShouldRedirectIndex() {
    $registry = Zend_Registry::getInstance();
    $em = $registry->entitymanager;
    $user = new Application_Model_User();
    $user->setEmail('test@test.com');
    $em->persist($user);
    $em->flush();
    $this->dispatch('/index/redirect-user');
    $this->assertRedirectTo('/'); 
    $em->remove($user);
    $em->flush(); 
}

在我看来,这似乎是一种非常混乱的编写测试方式。我的印象是,使用doctrine我不需要实际刷新到数据库,因为我的对象将存储在持久层中,但目前我的测试失败而没有刷新。

如果有人知道更好的方式我可以写测试,或者可以帮助我看看我哪里出错了,我会非常感激。

谢谢

1 个答案:

答案 0 :(得分:1)

您可以使用testUserAvaliableShouldRedirectIndex()setUp()来创建和删除用户,而不是在tearDown()中创建和删除用户。这样,您可以在期望现有用户的所有操作中使用该用户,例如redirectUserAction()loginAction()等,而不必执行您当前为这些操作执行的操作。