2012-04-23 142 views
2

我最近剛開始使用MVC,因爲我聽說MVC的主要優勢在於它使應用程序單元可測試。在編寫第一次單元測試之後,我發現測試內部有很多邏輯的控制器(發送確認電子郵件,使用會話,上下文和其他ASP Net靜態)並不總是很簡單。編寫單元測試需要更多的時間,而不是功能,我不相信這是有用的。MVC 3:測試控制器VS集成測試

我很想將業務邏輯轉移到一個「服務」層,它消除了所有ASP Net靜態並且可以輕鬆測試。然後使用Selenium進行集成測試以測試整個功能。

  1. 當測試某個動作非常複雜時(特別是嘲笑輸入和設置環境),您是否陷入了困境?

  2. 您是否找到了在控制器中使用業務邏輯的好方法。或者您發現使用服務和控制器代碼只是在服務調用上進行中繼更好?

  3. 在我看來,測試控制器更像是集成測試,而不是單元測試。你怎麼看待這件事?

  4. 您認爲單元測試控制器比集成測試有什麼優勢嗎?

回答

3

難道測試時的動作很複雜(尤其是嘲諷輸入和建立環境)你坐進情況?

當您的控制器有很多依賴關係並且它們緊密連接到它們時,會發生這種情況。除非它是現有的代碼和使修改代碼創建更多的麻煩,你應該鬆散耦合通過接口或抽象類的依賴關係,這讓單元測試那麼容易。你甚至應該使用Session,Cache和類似對象的包裝器。

由於@Dismissile表明,首先你必須重新因數控制器及隨後的單元測試會很容易。

您是否找到了一種在控制器中具有業務邏輯的好方法。或者您發現使用服務和控制器代碼只是在服務調用上進行中繼更好?

控制器不是放置業務邏輯的地方。所有的業務邏輯都應該放在Model類中。控制器的全部責任是與模型交談並返回視圖,json或返回給客戶端的任何內容。如果控制器中有複雜的業務邏輯,則應將它們移動到模型類中。

只要你想一想「轉儲視圖..薄控制器..脂肪模型」!

在我看來,測試控制器更像是集成測試而不是單元測試。你怎麼看待這件事?

集成測試與單元測試完全不同。在集成測試中,您必須設置應用程序並針對它運行測試用例。在這裏,您正在測試每個測試場景中總應用程序的行爲,而不是單個單元。單元測試就是測試課堂中各種方法的功能。在單元測試中測試類或方法應該獨立於其他類或方法。

但是,當設計一個應用程序單元時,應該牢記測試,否則單元測試將變得與集成測試一樣困難,當然它不是單元測試。

您認爲單元測試控制器比集成測試有什麼優勢嗎?

與系統級別相比,在單元級別查找和修復錯誤非常容易。所以答案是肯定的。

我認爲你的情況你有一個應用程序有控制器比他們必須做的更多。所以,如果你正在考慮單元測試如此嚴重,那麼你必須在任何你需要的地方重新考慮和鬆散地依賴它們,否則在編寫單元測試方面沒有太大的收穫。

5

我很想業務邏輯移動到「服務」層,所有的ASP淨靜的 消除,並且可以很容易地進行測試。然後 使用硒進行集成測試,以測試整個 的功能。

這幾乎就在這裏。如果你的控制器很複雜,那麼他們需要重構。他們根本沒有任何商業邏輯。您可以使用Mock框架來模擬服務層,並以這種方式輕鬆測試您的控制器。

在我看來,測試控制器更相當於集成 測試比單元測試。你怎麼看待這件事?

我不同意這一點。您正在測試您的控制器,以確保它根據您提供的輸入返回適當的響應。提供一個不存在的ID?重定向到另一個頁面或返回一個NotFound視圖。模型狀態無效?再次返回了同樣的看法,等

+0

無法更好或更簡潔地解釋。 – 2012-04-23 19:10:51