gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:57:08 26 4
gpt4 key购买 nike

我正在使用 Moq 来测试调用 RemoveRange 的代码在 DbSet<T> 上.我 mock 了上下文对象和DbSet ,但是当我尝试验证是否调用了 RemoveRange 时,我得到“预期对模拟调用一次,但为 0 次。”我正在测试的方法有这段代码:

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> .我也曾尝试调用 Verify在 mock DbSet ,但这也不起作用,这是有道理的,因为调用是直接针对数据上下文进行的。

为什么这不是验证?如何验证?

最佳答案

您需要在正确的 mock 上调用 Verify:

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

关于c# - 如何验证是否已在模拟 DbContext 上调用了 RemoveRange?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30898086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com