2012-02-05 7 views
10

Oryginalna metoda, którą wciąż wywoływano, gdy próbuję użyć Moq. Tu jest mój kodu:Konfiguracja Moq nie działa, oryginalna metoda jest nadal nazywana

var mockedBetRepository = new Mock<BetRepository>(new FakeSiteContext()); 
mockedBetRepository.CallBase = true; 
Bet bet = new Bet(); 
mockedBetRepository.Setup<Bet>(m => m.UpdateBet(bet)).Returns(bet); 

betRepository = mockedBetRepository.Object; 

Później w kodzie, betRepository.UpdateBet(bet) nazywa, ale to nie moja szydzili metoda, która jest wywoływana, natomiast metoda klasy jest wywoływana:

public virtual Bet UpdateBet(Bet betToUpdate) 
{ 
    siteContext.Entry(betToUpdate).State = System.Data.EntityState.Modified; 
    siteContext.SaveChanges(); 
    return betToUpdate; 
} 

Dlaczego to się dzieje ?

Odpowiedz

8

Znalazłem problem.

Jeśli mogę zastąpić

Bet bet = new Bet(); 
mockedBetRepository.Setup<Bet>(m => m.UpdateBet(bet)).Returns(bet); 

z tym

mockedBetRepository.Setup<Bet>(m => m.UpdateBet(It.IsAny<Bet>())).Returns((Bet b) => b); 

Wtedy to działa.

+0

Czy używasz tego samego odniesienia podczas konfigurowania metody tak, jak robisz to, gdy jest ona wywoływana? Jest tak, aby wyjaśnić zachowanie, które widziałeś, ponieważ Moq może być użyty do przetestowania, które wartości zostały użyte podczas weryfikacji. W przypadku typów odniesienia byłyby to konkretne instancje obiektu. – Andy

+0

Tak, to było prawdopodobnie to. Nie wiedziałem, że makiety są tak ekskluzywne i jednoznaczne. – ErikTJ

0

Twoje ustawienie callbase na true, które wywoła rzeczywistą implementację.

+0

Tak, wywoła podstawową implementację "jeśli żadna konfiguracja nie pasuje", co mogę zobaczyć? – ErikTJ

+0

@ErikTJ Czy próbowałeś tego bez CallBase = true? – Andy

+0

Znalazłem rozwiązanie, zobacz moją odpowiedź. Również ustawienie CallBase = false nie jest możliwe, ponieważ muszę udawać tylko jedną z wielu metod. – ErikTJ