【问题标题】:Zend Framework 1.11, Doctrine2 - How to test controllers without flushing to the databaseZend Framework 1.11,Doctrine2 - 如何在不刷新到数据库的情况下测试控制器
【发布时间】:2012-03-12 02:45:29
【问题描述】:

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

例如,假设我的控制器中有以下假设操作。

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(); 
}

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

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

谢谢

【问题讨论】:

    标签: zend-framework doctrine controller phpunit


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我认为这会有所帮助,但我想知道是否可以在不实际将数据写入数据库的情况下设置测试。我的理解是,对控制器进行功能测试不应该涉及写入数据库,但我可能错了。
    • @user1070377:您必须模拟实体管理器。我的理解是这样做很麻烦,更常见的是简单地为您的测试环境使用单独的数据库,并在 setUp/tearDown 中使用固定装置来控制该测试数据库的状态。
    • 对不起,这应该是一个帖子,但我还没有很好的声誉。我决定使用 setup 和 tear down 方法,但使用原则事务来保持数据库处于干净状态。公共函数 setUp() { $this->bootstrap = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini');父::setUp(); $registry = Zend_Registry::getInstance(); $this->_em = $registry->entitymanager; $this->_em->beginTransaction(); } 公共函数 tearDown() { $this->_em->rollBack(); }
    猜你喜欢
    • 2013-11-26
    • 2023-03-18
    • 2015-10-28
    • 2011-07-25
    • 2020-08-05
    • 2021-12-22
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多