2011-04-19 162 views
4

我試圖單元測試我的控制器,但我在互聯網上找到的每個教程都說我應該使用$ this-> dispatch(「controller/action」)來運行我想測試的特定動作。但是像這樣做,我不能嘲笑任何類似數據映射器或其他方法的其他調用。如何使用PHPUnit測試和模擬zend框架控制器?

爲了解決這個問題,我試圖讓控制器類的實例,然後直接打電話給我想測試方法,做起來這個樣子,我得到一個錯誤:

Zend_Exception: Setting request object manually is not allowed 

林甚至不知道這是正確的方法,因爲我真的不知道我將如何測試這樣做的事情。

我的測試用例:http://pastie.org/1812717

我ControllerTestCase:http://pastie.org/1812722

任何幫助,將不勝感激。 謝謝。

回答

3

有兩種解決方法:

  1. 僞單元測試(更像驗收測試)與Zend_Test_PHPUnit_ControllerTestCase
  2. 創建控制器的新實例,通過所有必需的依賴(調度,請求,響應,插件管理器等等)

他們倆實際上都需要調度過程。第一,調度應用程序,第二,調度控制器。

請參閱完整的Zend Framework包中的手冊和樣本測試。

此外,請查看控制器源代碼,以瞭解依賴關係是如何管理的。

另請參閱關於依賴注入的其他關於Zend Framework控制器的SO帖子。

1

你的數據映射器(或其他對象)是如何實例化的?你是直接在控制器中實例化它還是從引導程序/註冊表中抓取它?如果使用註冊表或引導,然後將模擬放在註冊表/引導程序中。

如果您直接在控制器中實例化,則需要修改控制器。也許有一個控制器方法來設置數據映射器,然後有另一種方法來抓取數據映射器,如果沒有設置,然後實例化它。這可以讓你的測試注入一個模擬。

我通常不會在測試控制器時模擬很多類 - 我想測試整個應用程序及其渲染頁面的能力......看起來您正在測試數據庫中沒有記錄,那麼爲什麼不使用Zend_Test_PHPUnit_Db爲該測試設置一個空表,而不是模擬數據映射器返回任何數據?

+0

在控制器的init()方法的控制器類,IM設置屬性$這 - > _mapper與映射器的實例,但對於其他映射器即時調用控制器方法內的「新的MyMapper」。我想在BasicController類或類似的東西中創建一個新的方法調用getMapper()。 但正如我所說,當我試圖獲得一個實例時,我得到這個錯誤,所以我無論如何不能這樣做。 – fiunchinho 2011-04-19 21:52:50

2

我猜測Zend_Test_PHPUnit_ControllerTestCase阻止你能夠模擬Requset和Response對象。我會繞過它,只是擴展PHPUnit_Framework_TestCase。正如我在另一個問題中提到的,我現在正在嘲笑控制器,沒有任何問題。

下面是運行正常的示例測試:

http://pastie.org/1816705

AbstractRestController僅僅是延伸化Zend_Controller_Action