2016-09-06 84 views
1

我一直在研究很多關於單元測試的知識,我有幾個函數,其唯一目的是根據模型中的用戶輸入添加或更新數據庫中的行。從我讀過的內容來看,單元測試似乎並沒有真正用於此。集成測試可能更有意義,但我還沒有對這些進行過多研究。我很抱歉,如果這是其他地方,我試圖找到一個類似的例子,這個問題是我能找到的最接近的:https://softwareengineering.stackexchange.com/questions/198453/is-there-a-point-to-unit-tests-that-stub-and-mock-everything-public ...這意味着單元測試不是測試函數的最佳方式,只是調用數據庫。我是否需要單元測試此功能?

這裏是我們的數據庫功能中的一個例子...

public void AddDependant(AddDependantView addDependantView, int ID) 
    { 
     using (var db = new EnrollmentDataModel()) 
     { 
      Dependant dependant = new dependant(); 
      dependant.ID = ID; 
      dependant.FirstName = addDependantView.FirstName; 
      dependant.LastName = addDependantView.LastName; 
      dependant.Relation = addDependantView.Relation; 
      dependant.Birthday = (addDependantView.BirthDate).Value.ToString("MM/dd/yyyy"); 
      dependant.Active = true; 
      dependant.RowCreatedDateTime = DateTime.Now; 

      db.Dependant.Add(dependant); 
      db.SaveChanges(); 

      UpdateLog(ID, "Dependant Data Added", "User added their dependant data."); 
     } 
    } 

的「UpdateLog」函數調用結束時在結構上這一個相似,但增加了該記錄任何一個不同的數據庫中的條目用戶活動。

那麼這個函數會受益於單元測試嗎?如果它確實會有什麼好處?整合測試會是更好的選擇嗎?如果這太基本或太寬泛,我很抱歉,但對於單元測試我很新,希望進入良好實踐。

+4

根據定義,這不是一個單元測試,而是一個集成測試,因爲它具有一個外部依賴性,該屬性被內化到該方法。 如果你想單元測試這個,你需要做一個模擬數據存儲注入方法/類,而不是在方法中創建一個新的上下文。對此的看法各不相同......特別是因爲Linq 2 Sql無法處理的大量操作在模擬單元測試中不會失敗,而他們在集成測試中會失敗。 –

+2

由於它在內部創建數據庫上下文,因此無法對此函數進行單元測試。你想在這裏測試什麼? SQL查詢?你只能寫集成測試。 – tym32167

回答

4

要在最後回答您的問題,此功能將從集成測試中受益更多。從單元測試這個函數中獲得的好處主要是通知代碼中的某些內容何時發生變化。

例如,在模擬/間諜/存根中,您可以編寫測試來聲明此函數可以進行正確的db api調用。這些電話會得到正確的論點。然而,如果你的模擬與真實事物不同步,那麼這些測試可以作爲單元測試通過,並且在集成測試中仍然失敗。

你可以在這裏單元測試的最好部分是dependent對象。聲明它有一個ID,名字,姓氏等等......然後如果你的生產代碼曾經改變過,說其中一個屬性被意外刪除了。你的單元測試會讓你知道比集成測試更快的速度。

這裏的缺點是,你更有可能改變目的,然後在意外。這些單元測試可能會變得令人討厭,因爲它們每次改變都會失敗。

所以這是有利和不利的。這個好處是否值得這個麻煩取決於你。我認爲大多數人會同意,但對於像這樣的功能,集成測試就是你真正需要的。

相關問題