c# - unit - Configurando moq y verificando que un método fue llamado
moq repository c# (3)
En este momento, Moq está verificando que DoStuffAndLogInfo
llame a Info
con la cadena exacta "hacer cosas que se llamaron". Si realmente está llamando a Info
con un argumento diferente, y no te importa cuál es el argumento real, usa lo siguiente:
logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce());
Usando Microsoft Test Framework y Moq estoy intentando verificar si se llamó a un método log4net.
[TestMethod()]
public void Log_Info_When_Stuff_Is_Done()
{
SampleClass sampleObject = new SampleClass();
Mock<log4net.ILog> logMockObject = new Mock<log4net.ILog>();
sampleObject.Log = logMockObject.Object;
sampleObject.DoStuffAndLogInfo();
logMockObject.Verify(moqLog => moqLog.Info("do stuff got called"), Times.AtLeastOnce());
}
Recibo una excepción en la llamada de verificación que dice que
Se esperaba una invocación en el simulacro al menos una vez, pero nunca se realizó: moqLog => moqLog.Info ("se ha llamado para hacer cosas") No hay configuraciones configuradas. No se realizan invocaciones.
¿Qué estoy haciendo mal?
actualizar el problema fue con un getter para la propiedad SampleClas.Log. Siempre estaba devolviendo LogManager.GetLogger(...);
incluso cuando la propiedad ya estaba establecida en un ILogProxy. Tenía la impresión de que no se llamará al sampleObject.Log = logMockObject.Object;
la propiedad porque configuré un proxy como sampleObject.Log = logMockObject.Object;
Este no parece ser el problema del póster original, pero en mi caso tuve un mensaje de error muy similar. Se debió a mi llamada .Verify()
antes de la ejecución real. Por ejemplo, esto es incorrecto :
SampleClass sampleObject = new SampleClass();
Mock<log4net.ILog> logMockObject = new Mock<log4net.ILog>();
logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce());
sampleObject.Log = logMockObject.Object;
sampleObject.DoStuffAndLogInfo();
.... pero esto es correcto :
SampleClass sampleObject = new SampleClass();
Mock<log4net.ILog> logMockObject = new Mock<log4net.ILog>();
sampleObject.Log = logMockObject.Object;
sampleObject.DoStuffAndLogInfo();
logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce());
La prueba está correctamente configurada.
Verifique su sut para ver si Log.Info
realmente recibe una llamada dentro del método DoStuffAndLogInfo
.