使用Moq模拟IList.Add方法

5

我正在尝试设置一个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方法。

这是否可能?

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

1个回答

6

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)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接