欧元测试存储库

发布于 2025-02-11 17:50:13 字数 1304 浏览 1 评论 0原文

试图调查存储库。

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);

当它进入我的代码时,这总是返回空。我有一个类似的呼叫,不使用将返回值的谓词,看起来像这样:

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);
    });

Trying to moq a repository call.

public async Task<T> GetFirstOrDefault<T>(Expression<Func<T, bool>> predicate) where T : class
{
    return await WithQuery<T, T>(q => q.FirstOrDefaultAsync(predicate));
}

Then in my unit testing:

var ruleList = new List<Rule>() (Imagine my list here)

_mockRepository.Setup(x => x.GetFirstOrDefault<Rule>(x => It.IsAny<string>() == It.IsAny<string>())).ReturnsAsync(ruleList);

This always returns null when it goes into my code. I have a similar call not using a predicate that will return the value, it looks like this:

public Task<IEnumerable<T>> ListAll<T>() where T : class
{
    return WithQuery<T, IEnumerable<T>>(async q => await q.ToListAsync());
}

and

var ruleList = new List<Rule>() (Imagine my list here)

_mockRepository.Setup(x => x.ListAll<Rule>()).ReturnsAsync(ruleList);

This is not null. I'm probably missing something simple at this point but I have tried a few things without luck.

Edit: thanks to Nkosi for the explanation and with a slight modification I was able to do:

_mockRepository.Setup(x => x.GetFirstOrDefault<Rule>(It.IsAny<Expression<Func<Rule, bool>>>()))
    .Returns((Expression<Func<Rule, bool>> predicate) => {
        return Task.FromResult<Rule>(ruleList);
    });

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

傲世九天 2025-02-18 17:50:15

设置谓词中的表达式试图将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);
    });
    

如果

The expression in the setup predicate is trying to use It.IsAny as a parameter in the expression. That is why it is failing.

If the goal is to try to replicate the expected behavior using the list as a data source then review the following setup example

_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);
    });
    

The expression argument is captured and applied to the list using LINQ

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文