尝试调用存储库
public async Task<T> GetFirstOrDefault<T>(Expression<Func<T, bool>> predicate) where T : class
{
return await WithQuery<T, T>(q => q.FirstOrDefaultAsync(predicate));
}
然后在单元测试中:
var ruleList = new List<Rule>() (Imagine my list here)
_mockRepository.Setup(x => x.GetFirstOrDefault<Rule>(x => It.IsAny<string>() == It.IsAny<string>())).ReturnsAsync(ruleList);
当它进入我的代码时总是返回null。我有一个类似的调用,不使用将返回值的谓词,它看起来像这样:
public Task<IEnumerable<T>> ListAll<T>() where T : class
{
return WithQuery<T, IEnumerable<T>>(async q => await q.ToListAsync());
}
和
var ruleList = new List<Rule>() (Imagine my list here)
_mockRepository.Setup(x => x.ListAll<Rule>()).ReturnsAsync(ruleList);
这不是空的。在这一点上,我可能错过了一些简单的东西,但我已经尝试了一些没有运气的事情。
编辑:感谢Nkosi的解释,我做了一些修改:
_mockRepository.Setup(x => x.GetFirstOrDefault<Rule>(It.IsAny<Expression<Func<Rule, bool>>>()))
.Returns((Expression<Func<Rule, bool>> predicate) => {
return Task.FromResult<Rule>(ruleList);
});
设置谓词表达式是试图使用It.IsAny
作为参数的表达式。这就是它失败的原因。
如果目标是尝试使用列表作为数据源复制预期的行为,那么请查看以下设置示例
_mockRepository
.Setup(_ => _.GetFirstOrDefault<Rule>(It.IsAny<Expression<Func<Rule, bool>>>()))
.Returns((Expression<Func<Rule, bool>> predicate) => {
Rule result = ruleList.FirstOrDefault(predicate);
return Task.FromResult<Rule>(result);
});
使用LINQ
捕获表达式参数并将其应用于列表