2012-04-05 152 views
1

我有許多簡單的控制器類,它們使用Doctrine的實體管理器來檢索數據並將其傳遞給視圖。單元測試基本控制器

public function indexAction() { 
    $pages = $this->em->getRepository('Model_Page')->findAll(); 
    $this->view->pages = $pages; 
} 

我們到底應該測試什麼?

  • 我可以測試在行動路由,以確保配置正確
  • 我可能測試相應的視圖變量被設置,但這是繁瑣

findAll()方法或許應該存儲在可以使用模擬數據進行測試的存儲庫層中,但是這構成了不同的類型的測試並且使我們回到

的問題
我們應該作爲控制器測試的一部分進行測試?

回答

1

控制器爲您的應用程序保存核心邏輯。儘管簡單的「索引」控制器動作沒有任何特定的功能,但驗證/主動使用數據並生成視圖模型的功能幾乎是系統的最大功能。

例如,考慮登錄表單。無論何時發佈登錄數據,控制器都應驗證登錄名/密碼並返回:1)登錄狀態良好時登錄索引頁。顯示歡迎,{用戶}文本。 2)到登錄頁面,說在數據庫中找不到登錄名。 3)到登錄頁面,表示在db中找不到密碼。

這三種類型的輸出構成了完美的測試用例。您應該通過適當的操作來驗證正確的視圖模型/視圖是否被髮送回客戶端。

你不應該像神祕的東西看待控制器。它只是另一個代碼片段,並且它被測試爲任何其他代碼 - 任何爲用戶提供業務價值的複雜邏輯都應該進行測試。

此外,我建議使用像黃瓜這樣的框架進行驗收測試來生成有意義的測試用例。

+0

謝謝德米特里。驗收測試對於確保視圖中生成的輸出是正確的非常有用。非常喜歡Behat with Mink http://docs.behat.org/cookbook/behat_and_mink.html#writing-your-first-web-feature – dianovich 2012-04-05 21:50:07

+0

不客氣:) – 2012-04-06 05:13:57

0

控制器可能是最難測試的,因爲它有很多依賴關係。理論上你應該完全孤立地進行測試,但正如你已經看到的那樣 - 它沒有意義。

也許你應該從功能或驗收測試開始。它在整體上測試你的控制器動作。我同意以前的答案,您應該嘗試驗收測試工具。但是Cucumber適用於Ruby,對於PHP,您可以嘗試使用Codeception。它使測試變得簡單而有意義。

同樣在Codeception頁面上有關於how to test sample controllers的文章。