如何使用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 ()"

如何使用moq模拟Enumerable.Any()扩展的结果

Setup方法接受一个lambda,该lambda不是执行,而是解释,以便模拟可以识别将在测试期间调用的模拟对象的方法/属性以及应该返回/抛出/回调的内容等。

Moq不知道Enumerable.Any<T>(this T item)的实现,因此不知道T的哪些方法或属性将被访问,以及它们应该做什么/返回什么。

因此,为了模拟对Enumerable.Any的调用,您需要确定它依次调用对象的哪些方法/属性,然后模拟这些方法/属性。

您可以在这里找到实现。只需遵循调用路径并模拟Any需要调用的所有内容。