使用 lambda 并验证其 return 的 Moq 方法

Moq method that uses lambda and verify its return

建议的答案使用 It.IsAny<>,我们坚决不使用它。

所以我试图通过我的 collection 来验证 Expression<Func<Foo, bool>> 和 运行:

Expression<Func<Foo, bool>> testExpression = exp =>
    exp.Bars.Any(a => a.Bar.BarString == barString);

_fooRepository.Setup(f => f.GetAllListAsync(It.Is<Expression<Func<Foo, bool>>> 
   (exp => exp == testExpression)))
.Returns(Task.FromResult(fooList.Where(testExpression.Compile()).ToList()))
.Verifiable();

我尝试了几次答案,但是用谓词重载 return 不允许我在我的强类型列表上执行它。


我有一个方法,它接受一个字符串并在存储库上执行 lambda 以获得所有匹配的实例(但只期望一个)。

例如:

    var foo = await _fooRepository.GetAllListAsync(
        f => f.Bars.Any(b => b.Bar.BarString == barString));

有一些验证可以确保实际上只有一个被 returned - 然后 foo 的 属性 被 returned(我们会说 fooId)。

我遇到的问题是设置一个我可以验证的模拟 - 给定 Foo 列表,lambda return 是否达到预期结果?

此时我的测试非常糟糕(我一直在重写它并研究它太久了):

const string fooId = "fooId";
const string barString = "barString";
var fooList = new List<FooList>()
{
    new Foo()
    {
        FooId = fooId,
        Bars = new List<FooBar>()
        {
            new FooBar()
            {
                Bar = new Bar()
                {
                    BarString = barString
                }
            }
        }
    },
    new Foo()
    {
        FooId = "other foo",
        Bars = new List<FooBar>()
        {
            new FooBar()
            {
                Bar = new Bar()
                {
                    BarString = "other bars"
                }
            }
        }
    }

};

_fooRepository.Setup(f => f.GetAllListAsync(It.IsAny<Expression<Func<Foo, bool>>>()))
    .Returns(Task.FromResult(fooList))
    .Verifiable();

我尝试通过以下方式构建 expectedExpression:

Expression<Func<Foo, bool>> expectedExpression = exp => 

这就是我坚持的地方 - 因为,我可以毫不费力地创造出表情。我不确定如何让我的 fooList 在其上执行表达式。

我已经看到一些在 .Returns() 方法中使用 Lambda 的示例 - 但这似乎不是我希望它采用的路线,因为我希望它测试 方法,不是lambda我提供测试

任何方向将不胜感激。

我缺少的是我必须传递整个迭代的预期结果。

例如:

var fooList = new List<FooList>()
{
    new Foo()
    {
        FooId = fooId,
        Bars = new List<FooBar>()
        {
            new FooBar()
            {
                Bar = new Bar()
                {
                    BarString = barString
                }
            }
        }
    },
    new Foo()
    {
        FooId = "other foo",
        Bars = new List<FooBar>()
        {
            new FooBar()
            {
                Bar = new Bar()
                {
                    BarString = "other bars"
                }
            }
        }
    }

};

然后我不得不声明具有预期结果的迭代:

Func<Expression<Func<Foo, bool>>, bool> exprIsGood = expr => 
{
    var func = expr.Compile();

    return func(fooList[0])
        && !func(fooList[1]);
};

最后,我可以验证 lambda 并通过预期 return:

_fooRepository.Setup(
    f => f.GetAllListAsync(
        It.Is<Expression<Func<Foo, bool>>>(exp => exprIsGood(exp))))
    .Returns(Task.FromResult(new List<Foo> { fooList[0] }))
    .Verifiable();