Подтвердить что ты не робот

Moq: Лямбда-выражения в качестве параметров и их оценка в результатах

В моих модульных тестах я хочу, чтобы иметь возможность "найти" функцию моего репозитория в моей Единице работы, которая принимает лямбда-экспресс. Например:

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(??????) ???? */);
}

Я хочу иметь возможность использовать лямбду, пройденную методом, вызывающим поиск макета для поиска в моем издеваемом списке. Это возможно?

EDIT: Спасибо Крису за ответ. Это код установки для передачи выражения лямбда, которое передается методом, который ссылается на функцию макета:

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()));
4b9b3361

Ответ 1

Да, это возможно. Вы можете передать функцию 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()));