Moq测试存储库



尝试调用存储库

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

捕获表达式参数并将其应用于列表

相关内容

  • 没有找到相关文章

最新更新