簡體   English   中英

如何正確地對存儲庫中的CRUD操作進行單元測試?

[英]How To Properly Unit-Test CRUD Operations on a Repository?

意識到這可能聽起來像一個廣泛的問題 - 所以讓我澄清一下。 我有一個通過接口公開的存儲庫,有兩個具體的實現 - 一個MockRepository和一個EntityFrameworkRepository

現在,我有一個Unit-Test項目,通過[TestInitialize]的一行,可以對任一存儲庫運行所有測試。

我的問題基本上是“我該如何編寫測試”。

這就是我所擁有的:

C reate

// Arrange.
var foo = new Foo { .. };

// Act
Repository.Add(foo);
UnitOfWork.Commit();

// Assert
Assert.IsTrue(foo.Id > 0);

R etrieve

// Arrange.
var fooToGet = 1;

// Act
var foo = Repository.FindSingle(fooToGet);

// Assert
Assert.IsNotNull(foo);
Assert.AreEqual(foo.Id, fooToGet);

üPDATE

// Arrange.
var fooToGet = 1;
var nameToChangeFooTo = "FooBar";

// Act
var foo = Repository.FindSingle(fooToGet);
foo.Name = nameToChangeFooTo;
UnitOfWork.Commit();
var fooRetrievedAgain = Repository.FindSingle(fooToGet);

// Assert
Assert.IsNotNull(foo);
Assert.AreEqual(fooRetrievedAgain.Id, fooToGet);
Assert.AreEqual(fooRetrievedAgain.Name, nameToChangeFooTo);

D elete

// Arrange.
var fooToGet = 1;

// Act
var foo = Repository.FindSingle(fooToGet);
Repository.Remove(foo);
UnitOfWork.Commit();
var fooRetrievedAgain = Repository.FindSingle(fooToGet);

// Assert
Assert.IsNull(fooRetrievedAgain);

它的工作 ,同時為模擬和EF庫,但我的主要問題是C(創建)。 我不確定如何測試我的存儲庫上的添加操作。 我在做什么感覺不對

它傳遞給EF Repository,但為了讓它通過我的Mock Repository,我不得不使用反射來更新內存中的ID(討厭)。

那么 - 請您分享一些關於在存儲庫模式上測試CRUD操作的正確方法的建議嗎?

這是一個ASP.NET MVC應用程序,.NET 4,C#,實體框架4和工作單元/存儲庫模式。

謝謝。

編輯

只是為了澄清一下,這些並不是我所有的單元測試。 我有服務層的單元測試,以及業務規則測試。

如果我的上述存儲庫測試失敗,后者將(並且應該)失敗。 這就是重點測試我的存儲庫的基本操作 我錯了嗎?

一種選擇是使用內存數據庫(如SqlLite)來測試映射,查詢和存儲庫的行為。 這是Ayende 在這里討論的,盡管他的例子使用了NHibernate。

另一個似乎解決您設置域對象的ID的問題的選擇是使用測試假貨。 這是RhysC 在這里討論的。

IMO,你的創建測試應該:

  • 將實體添加到存儲庫
  • 斷言它被分配了一個ID
  • 使用ID檢索插入的實體
  • 將初始實體與讀取實體進行比較,並確保它們的屬性相同

我有很多像你這樣的單元測試,主要區別在於我使用深度比較方法來比較對象實例。 例如,我的U測試看起來像這樣:

  • 將實體添加到存儲庫
  • 使用ID檢索插入的實體
  • 更改一些實體屬性
  • 更新存儲庫中的實體
  • 使用ID檢索更新的實體
  • 將更新的實體與讀取實體進行比較,並確保它們的屬性相同(您可以為不可更新的屬性定義特定邏輯)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM