如何使用 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
,根本没有任何修改!
所以被测代码为:
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
,根本没有任何修改!