使用 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();
建议的答案使用 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();