2012-02-05 8 views
10

Il metodo originale è ancora chiamato quando tento di usare Moq. Ecco il mio codice:Installazione Moq non funzionante, il metodo originale è ancora chiamato

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; 

Più avanti nel codice, betRepository.UpdateBet(bet) si chiama, ma la sua non il mio metodo preso in giro che viene chiamato, invece, il metodo della classe viene chiamato:

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

Perché questo accada ?

risposta

8

Ho trovato il problema.

se sostituisco

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

con questo

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

allora funziona.

+0

Stai utilizzando lo stesso riferimento quando imposti il ​​metodo come quando viene effettivamente chiamato? È così che spiegherebbe il comportamento che stavi vedendo, dato che Moq può essere utilizzato per verificare che siano stati utilizzati valori specifici durante la verifica. Per i tipi di riferimento, sarebbero istanze specifiche del tuo oggetto. – Andy

+0

Sì, probabilmente lo era. Non sapevo che i mock erano così esclusivi ed espliciti. – ErikTJ

0

L'impostazione callbase su true, che chiamerà l'implementazione effettiva.

+0

Sì, chiamerà l'implementazione di base "se nessuna configurazione corrisponde", che cosa posso vedere, c'è? – ErikTJ

+0

@ErikTJ E lo hai provato senza CallBase = true? – Andy

+0

Ho trovato la soluzione, vedere la mia risposta. Anche impostare CallBase = false non è possibile poiché ho solo bisogno di prendere in giro un metodo di molti. – ErikTJ

Problemi correlati