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

标签 c# entity-framework unit-testing moq

我正在使用 Moq 来测试调用 RemoveRange 的代码在DbSet<T>上。我已经模拟了上下文对象和 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) 对象被传递给 RemoveRangeIEnumerable<Thing> 。我还尝试调用 Verify关于 mock DbSet ,但这也不起作用,这是有道理的,因为调用是直接针对数据上下文进行的。

为什么没有验证?如何验证?

最佳答案

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

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

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

相关文章:

c# - 客户端通常在几十分钟后与服务器断开连接

c# - Ado.Net 实体 : Object doesn't display linked members (foreign keys)

entity-framework - Entity Framework -荒谬的查询,将smallint转换为int以进行比较

sql-server - 我的开发计算机上的 Microsoft.SqlServer.Types 异常

javascript - 如何覆盖 javascript 代码模式 || {}

c# - 隐藏 gridview 行需要两次尝试

c# - 如果默认为空,在 C# 中使用空合并运算符是否总是多余的?

c# - 无法使用 Jive REST API 发布共享 - 出现 400 Bad Request 错误

java.lang.NoSuchMethodError : 'void org.springframework.util.Assert.state(boolean, java.util.function.Supplier)' 错误

c++ - 从 Visual Studio 2010 运行 BOOST 单元测试