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

时间:2013-12-03 23:48:56

标签: c# unit-testing lambda moq

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

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

我在单元测试中创建了测试列表以表示我的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(??????) ???? */);
}

我希望能够使用调用mock的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()));

1 个答案:

答案 0 :(得分:23)

是的,有可能。您可以将函数传递给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()));