如何使用 NSubstitite 模拟模拟 IQueryable<T> 的 .Where() 扩展

How do I mock the .Where() extension of a mocked IQueryable<T> using NSubstitite

所以被测代码为:

var query = _documentClient.CreateDocumentQuery<TEntity>(CollectionUri, GetFeedOptions()).AsQueryable();

foreach (var filter in filters)
{
    query = query.Where(filter);      
}

它在 query = query.Where(filter); 处抛出异常,其中我的过滤器是一个有效的表达式。

代码在运行时运行并编译,但我的单元测试抛出异常:

Value cannot be null.
Parameter name: arg0

at System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, Expression arg0, Expression arg1)


at System.Linq.Queryable.Where[TSource](IQueryable`1 source, Expression`1 predicate)

at .DataAccess.Core.CosmoDbRepositoryBase`1.GetAsync(IEnumerable`1 filters, Int32 take, Boolean getAll) in C:\...DataAccess\Core\CosmoDbRepositoryBase.cs:line 223

但是,我的 arg0 不为空 我的模拟,使用 XUnit & NSubstitute,看起来像这样:

IDocumentClient _documentClient = Substitute.For<IDocumentClient>();
var document = new Document();
document.LoadFrom(new JsonTextReader(new StringReader(JsonConvert.SerializeObject(TestDataFactory.GetFakeResourceEntity()))));
var response = new ResourceResponse<Document>(document);
_documentClient.CreateDocumentAsync(Arg.Any<Uri>(), Arg.Any<object>(), Arg.Any<RequestOptions>(), Arg.Any<bool>(), Arg.Any<CancellationToken>())
            .Returns(Task.FromResult(response));

你不要嘲笑.Where(predicate)。你嘲笑 predicate 本身。基本上,collection.Where(_ => true) 将永远只是 collection,根本没有任何修改!