Moq:Lambda表达式作为参数并在返回值中进行评估

Cha*_*fow 14 c# lambda unit-testing moq

在我的单元测试中,我希望能够在我的工作单元中使用lambda express来获取我的存储库的"查找"功能.例如:

public virtual IQueryable<T> Find(Expression<Func<T, bool>> predicate)
{ 
    // Find OPS 
}
Run Code Online (Sandbox Code Playgroud)

我在单元测试中创建了测试列表以表示我的dbSets(同样,我省略了很多抽象,以使这个问题更加简单):

[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(??????) ???? */);
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:感谢克里斯的回答.这是设置代码,用于传递由引用模拟函数的方法传递的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()));
Run Code Online (Sandbox Code Playgroud)

Chr*_*tle 24

对的,这是可能的.您可以将函数Returns传递给传递的表达式Find,将表达式编译为a 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()));
Run Code Online (Sandbox Code Playgroud)