2013-12-03 5 views
12

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

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

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

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

ответ

17

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

Это сработало! Спасибо. – Channafow

+0

@ChrisMantle: Спасибо! Я тянул свои волосы. Это помогло мне через 4 года! – Razort4x

Смежные вопросы