2012-02-05 18 views
10

El método original todavía se llama cuando trato de usar Moq. Aquí está mi código:Moq Setup no funciona, el método original todavía se llama

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; 

Más adelante en el código, betRepository.UpdateBet(bet) se llama, pero no es mi método burlado, que es llamada, en cambio, el método de la clase se llama:

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

¿Por qué sucede esto ?

Respuesta

8

He encontrado el problema.

si reemplazo

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

con este

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

entonces funciona.

+0

¿Está utilizando la misma referencia cuando configura el método que cuando lo llama realmente? Es así que eso explicaría el comportamiento que estaba viendo, ya que Moq puede usarse para probar que se usaron valores específicos al verificar. Para tipos de referencia, eso sería instancias específicas de su objeto. – Andy

+0

Sí, eso fue probablemente. No sabía que los simulacros eran tan exclusivos y explícitos. – ErikTJ

0

Su configuración callbase true, que llamará a su implementación real.

+0

Sí, llamará a la implementación base "si no hay configuraciones que coincidan", que lo que puedo ver, ¿lo hay? – ErikTJ

+0

@ErikTJ ¿Y lo intentó sin CallBase = cierto? – Andy

+0

He encontrado la solución, ver mi respuesta. También establecer CallBase = false no es posible ya que solo necesito simular un método de muchos. – ErikTJ

Cuestiones relacionadas