c# - 使用 Moq 模拟 IList.Add

标签 c# unit-testing entity-framework-6 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)));

关于c# - 使用 Moq 模拟 IList.Add,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55785701/

相关文章:

javascript - 通过实习生对浏览器 CommonJS 模块进行单元测试

c# - ToList() 在使用 Include 时评估不正确

c# - 一对多和递归关系 - 要设置的强制值

c# - 使用 Linq to Entities (EF6) 动态选择列名

c# - mono 3 - 文件发布时出现 System.Web 异常

c# - C#注销后如何清除存储的数据?

c# - 'using Namespace'指令的解释

c# - 如何从两个窗口访问一个类(C# WPF)

java - Mockito Spy - 部分模拟不起作用?

ios - 在使用 Cocoapods 的项目中执行单元测试时出现 "Class X is implemented in both"