如何验证是否已在模拟 DbContext 上调用了 RemoveRange?
How can I verify that RemoveRange has been called on a mock DbContext?
我正在使用 Moq 测试在 DbSet<T>
上调用 RemoveRange
的代码。我已经模拟了上下文对象和 DbSet
,但是当我尝试验证是否调用了 RemoveRange 时,我得到 "Expected invocation on the mock once, but was 0 times." 我正在测试的方法具有以下代码:
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
的对象是一个 IEnumerable<Thing>
。我还尝试在模拟的 DbSet
上调用 Verify
,但这也不起作用,这是有道理的,因为调用是直接针对数据上下文进行的。
为什么这不是验证?如何验证?
您需要在正确的模拟上调用 Verify
:
mockThingSet.Verify(c => c.RemoveRange(It.IsAny<IEnumerable<Thing>>()), Times.Once);
我正在使用 Moq 测试在 DbSet<T>
上调用 RemoveRange
的代码。我已经模拟了上下文对象和 DbSet
,但是当我尝试验证是否调用了 RemoveRange 时,我得到 "Expected invocation on the mock once, but was 0 times." 我正在测试的方法具有以下代码:
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
的对象是一个 IEnumerable<Thing>
。我还尝试在模拟的 DbSet
上调用 Verify
,但这也不起作用,这是有道理的,因为调用是直接针对数据上下文进行的。
为什么这不是验证?如何验证?
您需要在正确的模拟上调用 Verify
:
mockThingSet.Verify(c => c.RemoveRange(It.IsAny<IEnumerable<Thing>>()), Times.Once);