我正在使用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()“
答案 0 :(得分:2)
Setup
方法接受一个不是执行但是解释的lambda,以便模拟可以识别将要执行的模拟对象的方法/属性在测试期间调用以及应该返回/抛出/调用什么/等等。
Moq不知道Enumerable.Any<T>(this T item)
的实现,因此无法确定将访问T
的哪些方法或属性或应该返回的内容。
因此,为了模拟对Enumerable.Any
的调用,您需要确定对象的哪些方法/属性,然后调用,然后模拟它们。
You can find the implementation here。只需按照通话路径模拟Any
需要调用的所有内容。