c# - 使用 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)));
推荐阅读
- python - 如何从多对多字段中获取相关对象
- python - 在“windows-latest”vm上使用powershell任务时如何在azure上使用conda?
- python-2.7 - Netowrkx len() 命令给出“str”对象错误
- javascript - 如何使用 msw(模拟服务工作者)设置请求对象的 responseURL
- matlab - 移动最小二乘拟合有问题的点位移
- c++ - 我怎样才能将 wchar_t* 交给 espeak 而不让德语字符发音不正确?
- python - dict 参数的类型注释
- xml - XQuery - 相当于 SQL NOT IN
- python - append(variable) 插入错误的值,我不知所措
- c# - 组合框选定值返回 System.Data.DataRowView