使用 Moq 模拟 IList.Add

我正在尝试设置一个最小起订量对象以针对使用 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。


这可能吗?


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


holdtom
浏览 91回答 1
1回答

慕娘9325324

IList.Add方法返回void,所以你不能设置返回,而不是使用.CallbackmockSet.As<IList<T>>() &nbsp;&nbsp;&nbsp;&nbsp;.Setup(m&nbsp;=>&nbsp;m.Add(It.IsAny<T>())) &nbsp;&nbsp;&nbsp;&nbsp;.Callback<T>(item&nbsp;=>&nbsp;list.Add(item));或使用Capture.InmockSet.As<IList<T>>() &nbsp;&nbsp;&nbsp;&nbsp;.Setup(m&nbsp;=>&nbsp;m.Add(Capture.In(list)));
打开App,查看更多内容
随时随地看视频慕课网APP