编程语言
首页 > 编程语言> > c#-使用Moq模拟一个IList.Add

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,因此您无法设置return,而是使用.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)));

标签:unit-testing,entity-framework-6,moq,c
来源: https://codeday.me/bug/20191108/2005657.html