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

时间:2014-05-31 18:36:42

标签: c# unit-testing moq

我正在使用mongo驱动程序,并试图伪造任何结果来测试是否根据结果调用了插入或更新。

以下是我认为相关的代码:

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

我得到了异常

  

“表达式引用不属于模拟的方法   对象:q =&gt; q.Any()“

1 个答案:

答案 0 :(得分:2)

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

Moq不知道Enumerable.Any<T>(this T item)的实现,因此无法确定将访问T的哪些方法或属性或应该返回的内容。

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

You can find the implementation here。只需按照通话路径模拟Any需要调用的所有内容。