gpt4 book ai didi

c# - Moq:Lambda 表达式作为参数并在返回中评估它们

转载 作者:可可西里 更新时间:2023-11-01 07:53:27 24 4
gpt4 key购买 nike

在我的单元测试中,我希望能够在接受 lambda 表达式的工作单元中最小化存储库的“查找”功能。例如:

public virtual IQueryable<T> Find(Expression<Func<T, bool>> predicate)
{
// Find OPS
}

我在我的单元测试中创建了测试列表来表示我的 dbSet(我还省略了很多抽象以使这个问题更简单):

[TestMethod]
public void FindTest()
{
var mockUnitOfWork = new Mock<IUnitOfWork>();
var testList = new List<ListObject>
{
// Test values
}
// Here is where I am stuck:
mockUnitOfWork.Setup(uow => uow.Find(It.IsAny<Expression<Func<ListObject, bool>>>()))
.Returns(/* ???? testList.Where(??????) ???? */);
}

我希望能够使用通过调用模拟的 find 的方法传递的 lambda 在我的模拟列表中进行搜索。这可能吗?

编辑:感谢 Chris 的回答。这是用于传递由引用模拟函数的方法传递的 lambda 表达式的设置代码:

mockUnitOfWork
.Setup(uow => uow.Find(It.IsAny<Expression<Func<ListObject, bool>>>()))
.Returns(new Func<Expression<Func<ListObject, bool>>, IQueryable<ListObject>>(
expr => testList.Where(expr.Compile()).AsQueryable()));

最佳答案

是的,这是可能的。您可以将函数传递给 Returns接受传递给 Find 的表达式, 将表达式编译成 Func<ListObject, bool> ,并将其应用于您的 testList :

mockUnitOfWork
.Setup(uow => uow.Find(It.IsAny<Expression<Func<ListObject, bool>>>()))
.Returns(new Func<Expression<Func<ListObject, bool>>, IQueryable<ListObject>>(
expr => testList.Where(expr.Compile()).AsQueryable()));

关于c# - Moq:Lambda 表达式作为参数并在返回中评估它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20364107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com