2011-07-26 13 views
19

W mojej metody, mam repozytorium ten sposób:MOQ - LINQ predykaty w ustawieniach Metoda

bool isConditionMet = MyRepository.Any(x => x.Condition == true); 

Ja próbuje szydzić to przy użyciu MOQ tak:

MyMockedRepository.Setup(x => x.Any(y => y.Condition == true)).Returns(true); 

Jednak, gdy kod wywołuje, wywołanie repozytorium zawsze zwraca wartość false.

Czy można to zrobić za pomocą MOQ?

** EDIT - Dodawanie kodu na życzenie **

Używam NHibernate więc moja Każda metoda jest w moim repozytorium bazowego i realizowane jako takie:

public virtual bool Any(Expression<Func<T, bool>> predicate) 
{ 
    return Session.Query<T>().Cacheable().Any(predicate); 
} 
+0

Czy mógłbyś pokazać więcej kodu dla 'MyRepository' to' Any() 'metoda rozszerzenia Linq lub część' MyRepository'? –

+0

Dodałem moją metodę Any na żądanie z mojego bazowego repozytorium. Wyśmiewana jest klasa 'IMyRepository', która jest zaimplementowana w' MyRepository'. – Brandon

Odpowiedz

23

Trzeba dopasować Argumenty wywołania za pomocą It.Is, It.IsAny lub It.IsRegex.

Na przykład, aby powrócić true dla żadnego orzecznik, można użyć:

MyMockedRepository 
    .Setup(x => x.Any(It.IsAny<Expression<Func<T, bool>>>())) 
    .Returns(true); 

Albo można meczu wszystkich wyrażeń, ale przekazać delegatowi, który zwróci wartość w zależności od wyrazu samo:

Func<Expression<Func<T, bool>, bool> resultFunc = { ... } 
MyMockedRepository 
    .Setup(x => x.Any(It.IsAny<Expression<Func<T, bool>>>())) 
    .Returns(resultFunc); 
+0

Dziękuję bardzo! To działało idealnie. – Brandon

+0

Proszę, czy możesz mi powiedzieć, jak resultFunc będzie wyglądać? –

+0

@badrslaoui: zależy od tego, co/jak testujesz. Na przykład możesz wiedzieć, że testowana metoda sprawdzi, czy repozytorium zawiera jakiekolwiek wartości i po prostu zwróci true. Możesz też kpić z repozytorium za pomocą zwykłej w pamięci generycznej 'Listy ', co oznacza, że ​​możesz po prostu przekazać parametr wyrażenia do 'IQueryable.Any' listy i pozwolić mu zwrócić' true' lub 'false'. Lub, ponieważ lambda może przechwytywać zmienne zewnętrzne, możesz także zachować flagę, która wskazuje, czy masz jakieś dane, czy nie, a następnie zwróć wartość flagi. – Groo

Powiązane problemy