![](/img/trans.png)
[英]Unit testing with Generic repository, UnitOfWork, NUnit and Moq
[英]How to write nUnit/Moq for testing generic extension methods?
我有以下通用擴展方法從ObjectContext中刪除所有EntityObjects
public static void DeleleAllObjects<TEntity>(this ObjectContext context)
where TEntity : EntityObject
{
var objectSet = context.CreateObjectSet<TEntity>();
objectSet.ToList().ForEach(e => objectSet.DeleteObject(e));
}
我是TDD並且使用nUnit / Moq的新手......但是我不知道在哪里為這個方法編寫測試?
我希望這有幫助:
[TestFixture]
public class ExtensionTest
{
public class FakeEntity : EntityObject
{
}
[Test]
public void DeleteAllObjects()
{
//arrange
var objectsToDelete = new List<FakeEntity>
{
new FakeEntity(),
new FakeEntity()
};
var mockContext = new Mock<ObjectContext>();
var mockObjectSet = new Mock<ObjectSet<FakeEntity>>();
mockObjectSet.Setup(x => x.ToList()).Returns(objectsToDelete);
mockContext.Setup(x => x.CreateObjectSet<FakeEntity>()).Returns(mockObjectSet.Object);
//act
mockContext.Object.DeleteAllObjects<FakeEntity>();
//assert
mockContext.Verify(x => x.CreateObjectSet<FakeEntity>(), Times.Once());
mockObjectSet.Verify(x => x.ToList(), Times.Once());
mockObjectSet.Verify(x => x.DeleteObject(It.IsAny<FakeEntity>()), Times.Exactly(2));
}
}
現在,假設所有模擬類型(上下文和對象集)都將您調用的方法聲明為virtual
或類是abstract
。 模擬接口通常限制性較小。
此外,如果你想對你的斷言更加挑剔,以確保首先使用第一個實例調用DeleteObject
,然后使用第二個實例調用,而不是第一個實例,那么你可以更改測試的那一部分。 但這應該是一個很好的起點。
總結一下:
此特定測試應該只測試擴展方法中的代碼。 意思是,它應該只確保調用CreateObjectSet<>()
,獲取列表,然后在每個上調用DeleteObject
。
它確實不在乎DeleteObject()
確實改變了ObjectSet
(事實上它不會,因為它是一個模擬)。 這應該是DeleteObject()
方法測試的責任,但由於我假設這實際上是一個EF方法,所以不應該為第三方組件編寫測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.