C# Moq:Lambda表达式作为参数,并在返回中对其求值

C# Moq:Lambda表达式作为参数,并在返回中对其求值,c#,unit-testing,lambda,moq,C#,Unit Testing,Lambda,Moq,在我的单元测试中,我希望能够在我的工作单元中moq存储库的“find”功能,该功能采用lambda express。例如: public virtual IQueryable<T> Find(Expression<Func<T, bool>> predicate) { // Find OPS } 公共虚拟IQueryable查找(表达式谓词) { //查找操作 } 我创建了测试列表,以在单元测试中表示我的数据库集(我还省略了许多抽象,使这个问

在我的单元测试中,我希望能够在我的工作单元中moq存储库的“find”功能,该功能采用lambda express。例如:

public virtual IQueryable<T> Find(Expression<Func<T, bool>> predicate)
{ 
    // Find OPS 
}
公共虚拟IQueryable查找(表达式谓词)
{ 
//查找操作
}
我创建了测试列表,以在单元测试中表示我的数据库集(我还省略了许多抽象,使这个问题更简单):

[TestMethod]
公共void FindTest()
{
var mockUnitOfWork=new Mock();
var testList=新列表
{ 
//测试值
}
//这就是我被困的地方:
mockUnitOfWork.Setup(uow=>uow.Find(It.IsAny()))
.返回(/*???testList.Where(????)??*/);
}
我希望能够使用调用mock的find的方法传递的lambda在我的mock列表中进行搜索。这可能吗

编辑:感谢克里斯的回答。这是用于传递lambda表达式的设置代码,该表达式由引用mock函数的方法传递:

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()));
mockUnitOfWork
.Setup(uow=>uow.Find(It.IsAny()))
.Returns(新函数)(
expr=>testList.Where(expr.Compile()).AsQueryable());

是的,这是可能的。您可以将函数传递给
返回
,该函数接受传递给
查找
的表达式,将表达式编译成
函数
,并将其应用于您的
测试列表

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()));
mockUnitOfWork
.Setup(uow=>uow.Find(It.IsAny()))
.Returns(新函数)(
expr=>testList.Where(expr.Compile()).AsQueryable());

@ChrisMantle:谢谢!我在开玩笑。4年后它帮助了我!
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()));