如何使用moq模拟Enumerable.Any()扩展的结果
本文关键字:扩展 结果 Any 何使用 moq 模拟 Enumerable | 更新日期: 2023-09-27 18:05:59
我正在使用mongo驱动程序,并试图伪造任何结果来测试是否基于结果调用Insert或Update。
以下是我认为相关的一段代码:_context = _collection.AsQueryable();
if (_context.Any(s => s.Id == id))
{
...
之后我调用_collection.Update()
或_collection.Insert()
。
下面是我到目前为止所做的单元测试:
var collectionMock = new Mock<MongoCollection<Storage>>();
var queriableMock = new Mock<IQueryable<Storage>>();
queriableMock.Setup(q => Enumerable.Any(q)).Returns(() => false);
...
collectionMock.Setup(c => c.AsQueryable()).Returns(() => queriableMock.Object);
collectionMock.Setup(c => c.Save(It.IsAny<Storage>()));
我得到异常
"表达式引用了一个不属于被嘲弄对象的方法object: q => q. any ()"
Setup
方法接受一个lambda,该lambda不是执行,而是解释,以便模拟可以识别将在测试期间调用的模拟对象的方法/属性以及应该返回/抛出/回调的内容等。
Moq不知道Enumerable.Any<T>(this T item)
的实现,因此不知道T
的哪些方法或属性将被访问,以及它们应该做什么/返回什么。
因此,为了模拟对Enumerable.Any
的调用,您需要确定它依次调用对象的哪些方法/属性,然后模拟这些方法/属性。
您可以在这里找到实现。只需遵循调用路径并模拟Any
需要调用的所有内容。