2013-02-21 61 views
3

我已經花了兩天的時間開始並重新開始學習過程,因爲我真的不知道如何開始。單元測試MVC4應用程序服務層

我有一個三層MVC4應用程序:Web,Services和Core。控制器向服務層發送請求,服務層提供控制器用於爲視圖提供視圖模型的信息。

我在服務層下面的方法:

public interface ISetServices 
{ 
    List<Set> GetBreadcrumbs(int? parentSetId); 
    Set GetSet(int? setId); 
    Set CreateSet(string name, string details, int? parentSetId); 
    void DeleteSet(int? setId); 

    Card GetCard(int? cardId); 
    Card CreateCard(List<string> sides, string details, int? parentSetId); 
    void DeleteCard(int? cardId); 

    Side GetSide(int? sideId); 
    List<String> GetSides(Card card); 
    Side CreateSide(Card card, string content); 
    void DeleteSide (int? sideId); 

} 

我試圖找出如何創建單元測試類庫來測試這些功能。

當測試運行,我想一個TestDatabase被丟棄(如果存在的話)並重新創建,並用數據播種。我的Core項目中有一個「受保護的」種子方法,以及 - 我可以使用它嗎?如果是這樣,怎麼樣?

無論我讀說要在測試中從未使用一個數據庫,但我不能完全弄清楚測試的一點是什麼呢。這些服務用於訪問和更新數據庫...我不需要數據庫來測試嗎?

我創建了Project.Services.Tests單元測試項目,但不知道如何將所有東西連接起來。如果可能的話,我想用代碼而不是配置文件來做它......任何示例或指針都會被讚賞。

+0

這個問題沒有明智的解決方案,你可以寫更多 - 就像你使用任何ORM,你的數據庫是什麼? – 2013-02-22 08:38:43

回答

2

有許多方面對這個問題,讓我嘗試接近一些:

  • 單元測試是關於測試的代碼單元,最小的可測試的代碼,但測試的代碼單元與它的與數據庫的交互是集成測試問題
  • 通過使用存儲庫模式來解決此問題的一種方法 - 它是數據訪問層上的抽象層。你的服務接口看起來更像是一個存儲庫模式實現,谷歌圍繞它更多。
  • 有些人不測試內存庫模式的內部,他們只是斷言調用它的接口。數據庫測試被認爲是一個集成測試問題。
  • 有人直接寫在他們的單元測試,在那裏通常你會在安裝程序將適當的數據和拆卸將它全部清理到以前的狀態,但要注意的安裝和拆卸步驟擊中了他們的數據庫 - 他們可以得到相當緩慢,並讓你的單元測試痛苦。
  • 其他方法將配置您的測試使用不同的數據庫 - 例如SQLCE。對於某些ORM,數據庫交換可能相當容易。這比打「全」數據庫更快,而且似乎更清潔,但數據庫的實現有一個遲早會浮出水面,讓你的單元測試痛苦的區別...
  • 與目前的NoSQL解決方案訪問數據庫的上升直接可以得到非常很容易,因爲他們往往有自己的記憶同行(如RavenDB)

我意識到這可能會在一開始是有點勢不可擋,但同樣,這個問題有很多方面。您如何將源代碼發佈到github並在此分享?