2011-09-22 101 views
4

我需要在php中快速構建好的軟件並使用zend框架。我試圖以TDD的方式參與這項工作,因爲它比我更有經驗的人告訴我這是在保持代碼易於管理的同時快速構建的最佳方式。如何對zend動作控制器進行單元測試?

所以我得到了關於phpunit的書,並且很好地進行了,事實上在最初的麻煩之後,它開始加速並且代碼仍然很好。我很喜歡我的對象可以單獨進行測試。

然而,測試zend動作控制器存在一個主要問題。 zend_test包提供了一種測試方法。但這似乎是一次測試整個應用程序。我似乎無法很好地存根或模擬任何存儲庫或注入任何其他依賴項。所以我一直沒能像測試其他項目一樣對它們進行廣泛的測試,結果如圖所示。

我一直在尋找解決這個問題。但是我能在網上找到的就是zend_test的做法。

我想知道您對此的看法。也許我只是想做些事情,或者有更好的方法來開發zend動作控制器的單元測試。

回答

1

在Zend 1控制器是一個普通的類。你可以實例化它,你可以調用它的方法(例如,用你的資料庫的PHPUnit的模擬替代默認的庫:

class MyController extends Zend_Controller_Action 
{ 
    public functioni init() 
    { 
     $this->repository = new MyRepository(); 
    } 

    public function setRepository($repository) 
    { 
     $this->repository = $repository; 
    } 

    public function saveAction() 
    { 
     $dataToWrite = manipulate in some way $this->getRequest()->getParams(); 
     $this->repository->update($dataToWrite, ...); 
    } 
} 

但你也必須注入的請求,並調度它獲得響應。 。

親自爲控制器我喜歡寫功能測試,而不是單元測試(含Zend_Test)它是慢,你可能需要在內存中的SQLite數據庫,等等,但你知道,如果你的應用程序確實有效:你可以對每個類進行單元測試,但是如果一個連接你的對象的工廠是錯誤的,那麼你將繼續得到一個綠色的PHPUnit吧,它有一個破壞的應用程序。

+0

謝謝,的確,我看到了需要對軟件進行功能測試,我仍然需要手動完成,所以也許我應該爲此做一個測試套件。我不認爲我不想和單元測試一起運行它們。 (但可能是錯誤的。)我會試試instanciate,因爲我想知道視圖中有什麼對象。 – Bram

+0

您可以避免運行它們。例如,如果功能測試太慢或太慢,使用PHPUnit,您可以用'@group functional'標記測試用例並運行'phpunit --group $ groupname'。但在提交/推送源代碼之前,請確保所有測試都運行正常! – Francesco

1

Rob Allen在使用PHPUnit測試Zend Controller Actions時寫了一個very good article。這使用Zend_Test_PHPUnit_ControllerTestCase,它引導整個應用程序並測試響應。

PHPUnit和功能測試通常不適合測試控制器。相反,控制器不適合單元測試。因此,我的意思是單元測試的概念對控制層的概念沒有意義,並且控制器通常以一種使得它們固有地難以進行單元測試的方式來構建。

我建議的最佳選擇是使用Selenium。這測試了來自控制器的響應(所以在大多數情況下真的測試查看)。在Selenium測試之上,您還應該對模型和庫的其餘部分進行單元測試。這幾乎是無懈可擊的,因爲你可以真正進入控制器層。

+0

謝謝,我找到了artical,我聽說我可以將php和phpunit集成在一起,所以這是一種優雅的方式。 – Bram

相關問題