2016-05-13 58 views
0

我有一個數據庫2個表和結構看起來像單元測試的WebAPI用自定義模型

學生[ID,姓名,電子郵件地址,性別]

測試[ID,​​StudentId,名稱,狀態]

UserSummary [ID,姓名,電子郵件地址,性別,測試名,TestStatus]

所以在單元測試的做法,應該我驗證? db模型還是自定義模型?

我的API端點返回列表UserSummary作爲JSON返回到前端。

[TestMethod] 
public void GetAllStudents() 
{ 
    IQueryable<Student> masterdata = new List<Student> 
     { 
      new Student {StudentID=1, Firstname = "AAA",Active_InActive=1 }, 
      new Student {StudentID=2, Firstname = "BBB" ,Active_InActive=1 }, 
      new Student {StudentID=3, Firstname = "ZZZ" ,Active_InActive=1 }, 
     }.AsQueryable(); 
    var mockSet = new Mock<DbSet<Student>>(); 
    mockSet.As<IQueryable<Student>>().Setup(m => m.Provider).Returns(masterdata.Provider); 
    mockSet.As<IQueryable<Student>>().Setup(m => m.Expression).Returns(masterdata.Expression); 
    mockSet.As<IQueryable<Student>>().Setup(m => m.ElementType).Returns(masterdata.ElementType); 
    mockSet.As<IQueryable<Student>>().Setup(m => m.GetEnumerator()).Returns(masterdata.GetEnumerator()); 

    var mockContext = new Mock<SchoolDbEntities>(); 
    mockContext.Setup(c => c.Students).Returns(mockSet.Object); 

    var service = new StudentDbHandler(mockContext.Object); 
    var students = service.GetStudents(); //it returns list of Student 

    //So should i test Db models are same or Custom List<UserSummary> models are same? 
} 

所以,如果我要驗證自定義模型,我應該嘲笑定製模型以及從起訂量實體框架數據?有人可以建議任何教程解釋直接處理除Db模型以外的自定義模型數據的方式嗎?

回答

0

您應該在您的體系結構中集成用於數據訪問的圖層(DAO)。該層將負責持久化對象並執行查詢。

要測試此圖層,除了測試真實的數據庫(可能是內存模式)之外,沒有別的選擇。這將允許您驗證您的映射和查詢。

另一層(業務層)應該依賴於以前的DAO層。要測試業務層,您可以爲DAO提供模擬。您可以測試沒有數據庫的業務層。

如果可能的話,您的業務層中使用DAO的方法與不使用DAO的方法分開。測試一個靜態方法比較容易,該方法需要輸入實體並在輸出中提供實體,有時不需要模擬。

+0

問題是我是否應該驗證db模型或我的自定義模型?如果它的自定義模型,我應該如何從moq列表中獲取它們?在單元測試項目中,我應該將其轉換爲 –

+0

您測試依賴於其他服務的服務X.您應該問的問題是「我需要服務Y來測試服務X還是使用模擬服務Y」。你不應該問「我需要測試我的自定義模型嗎?」您的自定義模型的存在可以幫助您測試其他內容。 – mvera

1

如果你開始測試數據庫模型students結果,那麼你真正測試的是模擬庫實際工作。

您應該測試呼叫GetStudents()以及它如何與mockContext交互。我不知道該方法的內部結構,但我懷疑有數據庫調用和驗證檢查。你會堅持反對模擬上下文,看看它們是否按預期被調用。

您設置數據,以便檢查數據不會進行有效的測試。您需要測試與您的代碼的交互。

+0

在我的情況下,函數GetStudents()返回表Student的項目列表。但是我的實際API端點使用這個Db模型構造了一個StudentViewModel。所以在這種情況下,我應該如何編寫UnitTest。我無法找到任何樣本解釋這個概念[我的意思是處理數據庫模型和包裝對象模型]。有沒有任何教程或文章解釋這種方法 –