2

我目前有一個項目,我已經開始使用EF4,並且在事後再回來並添加單元測試。我在模型(數據庫)第一個上下文中使用了EF4 POCO T4 templates。我爲我的DAC邏輯使用通用存儲庫,並使用持久性工作模式單元。EF4.1 DbSet與EF4 ObjectContext和單元測試

但是,我遇到了一些問題,瞭解如何模擬ObjectContext/ObjectSet。我使用來自this articleFakeObjectSet<T>樣本進行了研究,但它仍然留下了一些內容,例如自動遞增身份和事務回滾。

所以,我試圖找到一個很好的EF設計,仍然可以完全單元測試。

我的問題是,EF4.1 DbSet是否解決了很多帶單元測試EF4的問題?是否有任何有關設計完全可測試的EF4.1解決方案的綜合文章?

另外,請記住,我需要一個模型優先的解決方案。

在此先感謝。

回答

6

模擬層的完全模擬行爲不是單元測試的要點。單元測試的重點是相信嘲笑層簡單地工作。單元測試驗證測試的方法不是模擬。你只需要驗證模擬的正確方法被調用,如果你的業務邏輯需要一些值,你可能會設置一些回調來修改傳遞的數據。示例:

您有業務方法將記錄插入數據庫並在插入後使用實體及其Id。該IObjectSet模擬將被配置爲:

  • 集期望AddObject被稱爲只有一次 - 你可以設置所期望的實例在驗證
  • 您可以定義回調AddObject來標識設置爲某個值,並用它後來在測試

DbSet將不會有任何區別 - 它只是包裝與ObjectSet具有類似的行爲。在我看來,沒有有效的方法可以讓嘲笑像真正的EF一樣行事。使用模擬EF +數據庫的行爲來創建模擬所需的工作量將比您的整個應用程序的工作量大得多!這不會再模擬它將是假EF提供商。

如果你想測試你的EF代碼(映射,查詢,持久化)和數據庫行爲(如自動增量,事務等),你必須編寫集成測試。在這裏,你有討論資料庫,工作單位和挑戰測試一些相關的問題:

+0

感謝您的答覆,這讓有很大的意義。我對TDD相當綠色,所以這些概念中的一部分仍然陷入了困境。你的文章幫助了我很多東西。 –