【问题标题】:How can I verify that RemoveRange has been called on a mock DbContext?如何验证已在模拟 DbContext 上调用了 RemoveRange?
【发布时间】:2015-06-17 17:10:38
【问题描述】:

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

为什么不进行验证?如何验证?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 他确实尝试过,但没有成功。来自问题:“我也尝试在模拟的 DbSet 上调用验证,但这也不起作用”
    猜你喜欢
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    相关资源
    最近更新 更多