2012-02-21 55 views
2

我用ZF 1.11設置了doctrine2,我很難學習單元測試控制器的最佳方法。我希望能夠測試控制器中的操作,而不必在單元測試中寫入數據庫,但是我發現實際上無法這樣做。Zend Framework 1.11,Doctrine2 - 如何測試控制器而不會沖洗數據庫

例如,說我在我的控制器中有以下假想的行爲。

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

我想要測試是否有一個有效的電子郵件地址[email protected]用戶會重定向到/所以此刻我有以下的測試。

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

在我看來,這似乎是一種非常混亂的編寫測試的方式。我的印象是,在教條中,我不需要實際刷新數據庫,因爲我的對象將存儲在持久層中,但此時我的測試失敗而沒有刷新。

如果有人知道更好的方法,我可以寫測試或可以幫助我看看我要去哪裏錯我會非常感激。

感謝

回答

1

不是創建和刪除用戶testUserAvaliableShouldRedirectIndex()你可以使用setUp()tearDown()創建和刪除用戶。通過這種方式,您可以在期望現有用戶的所有操作中使用該用戶,例如redirectUserAction(),loginAction()等,而不必執行您目前爲每項操作執行的操作。

+0

謝謝,我認爲這將有所幫助,但我想知道是否可以在沒有實際將數據寫入數據庫的情況下設置測試。我的理解是,對控制器進行功能測試不應涉及寫入數據庫,但我可能是錯的。 – Julian 2012-02-21 20:01:30

+0

@ user1070377:你必須模擬實體管理器。我的理解是,這樣做很麻煩,以至於在測試環境中簡單地使用單獨的數據庫並使用setUp/tearDown中的設備來控制該測試數據庫的狀態更爲常見。 – 2012-02-21 20:18:54

+0

好吧,這是有道理的,謝謝你的幫助。 – Julian 2012-02-21 20:29:27

相關問題