Eug*_*gen 5 c# unit-testing moq entity-framework-6
我正在尝试设置一个起订量对象来针对使用 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;
}
Run Code Online (Sandbox Code Playgroud)
我试图模拟Add列表中的实际方法,但如上所述,没有方法.Return。
这可能吗?
我需要在发生一些逻辑后验证该对象是否已插入到我的模拟集合中。
IList.Add方法返回,void因此您无法设置返回,而是使用.Callback
mockSet.As<IList<T>>()
.Setup(m => m.Add(It.IsAny<T>()))
.Callback<T>(item => list.Add(item));
Run Code Online (Sandbox Code Playgroud)
或使用Capture.In
mockSet.As<IList<T>>()
.Setup(m => m.Add(Capture.In(list)));
Run Code Online (Sandbox Code Playgroud)