使用Moq模拟IList.Add

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Moq模拟IList.Add相关的知识,希望对你有一定的参考价值。

我正在尝试设置一个moq对象来对使用EF6的业务层对象运行一些单元测试。到目前为止,我可以测试简单的方法调用,并检查是否调用了这些方法。但是,有没有办法测试对象是否实际插入到底层集合中。

这是我的模拟方法

private Mock<DbSet<T>> CreateMockDbSet<T>(IQueryable<T> entities) where T : class
{
    var mockSet = new Mock<DbSet<T>>();
    mockSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(entities.Provider);
    mockSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(entities.Expression);
    mockSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(entities.ElementType);
    mockSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(entities.GetEnumerator());
    IList<T> list = entities as IList<T>;
    mockSet.As<IList<T>>().Setup(m => m.Add(It.IsAny<T>())).Returns(list.Add(It.IsAny<T>()));
    mockSet.Setup(m => m.Include(It.IsAny<string>())).Returns(mockSet.Object);
    return mockSet;
}

我试图从列表中模拟实际的Add方法,但如上所述,说没有方法.Return

这甚至可能吗?

在发生某些逻辑后,我需要验证对象是否插入到我的模拟集合中。

答案

IList.Add方法返回void所以你不能设置返回,而不是使用.Callback

mockSet.As<IList<T>>()
    .Setup(m => m.Add(It.IsAny<T>()))
    .Callback<T>(item => list.Add(item));

或使用Capture.In

mockSet.As<IList<T>>()
    .Setup(m => m.Add(Capture.In(list)));

以上是关于使用Moq模拟IList.Add的主要内容,如果未能解决你的问题,请参考以下文章

使用Moq模拟实体框架6 ObjectResult

使用 Moq 模拟类时,如何仅针对特定方法进行 CallBase?

如何使用 MOQ 框架在 c# 中模拟静态方法?

模拟复杂的对象 - 用Moq测试

使用 Moq 模拟扩展方法

使用 Moq 模拟 NHibernate ISession