如何验证是否已在模拟DbContext上调用RemoveRange?

时间:2015-06-17 17:10:38

标签: c# entity-framework unit-testing moq

我正在使用Moq来测试RemoveRange上调用DbSet<T>的代码。我已经模拟了上下文对象和DbSet,但是当我尝试验证RemoveRange被调用时,我得到&#34;模拟一次的预期调用,但是是0次。&#34;我测试的方法有以下代码:

IEnumerable<Thing> thingsToRemove = GetThingsToRemove();
DataContext.Things.RemoveRange(thingsToRemove);

我的测试代码如下所示:

var mockContext = new Mock<MyDbContext>();
var mockThingSet = new Mock<DbSet<Thing>>();
var testData = new List<Thing>{new Thing{Id = 1, Name = "Test Thing"}};
mockThingSet.As<IQueryable<Thing>>().Setup(m => m.Provider).Returns(testData .Provider);
mockThingSet.As<IQueryable<Thing>>().Setup(m => m.Expression).Returns(testData.Expression);
mockThingSet.As<IQueryable<Thing>>().Setup(m => m.ElementType).Returns(testData.ElementType);
mockThingSet.As<IQueryable<Thing>>().Setup(m => m.GetEnumerator()).Returns(testData.GetEnumerator);
mockContext.Setup(c => c.Things).Returns(mockThingSet.Object);  
//call the method being tested, then....  
mockContext.Verify(c => c.Things.RemoveRange(It.IsAny<IEnumerable<Thing>>()), Times.Once);

我已经逐步完成了代码并验证了1)调用RemoveRange的行被命中并且没有抛出异常,2)传递给RemoveRange的对象是{{1} }。我也尝试在模拟的IEnumerable<Thing>上调用Verify,但这也不起作用,这是有道理的,因为调用是直接针对数据上下文进行的。

为什么不进行此验证?我该如何验证?

1 个答案:

答案 0 :(得分:4)

您需要在正确的模拟上调用Verify

mockThingSet.Verify(c => c.RemoveRange(It.IsAny<IEnumerable<Thing>>()), Times.Once);
相关问题