web-dev-qa-db-fra.com

Configurer moq et vérifier qu'une méthode a été appelée

À l'aide de Microsoft Test Framework et Moq, j'essaie de vérifier si une méthode log4net a été appelée. 

    [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());

    }

Je reçois une exception sur Verify Call disant que 

L'appel attendu sur le modèle au moins une fois, mais n'a jamais été exécuté : MoqLog => moqLog.Info ("les éléments ont été appelés") Aucune configuration Configurée. Aucune invocation effectuée.

Qu'est-ce que je fais mal?

update le problème concernait un getter pour la propriété SampleClas.Log. Je retournais toujours LogManager.GetLogger(...); même lorsque la propriété était déjà définie sur ILogProxy. J'étais sous l'impression que l'accesseur get de la propriété ne sera pas appelé car j'ai mis en place un proxy tel que sampleObject.Log = logMockObject.Object;

16
dev.e.loper

À l’heure actuelle, Moq vérifie que DoStuffAndLogInfo appelle Info avec la chaîne exacte "les éléments appelés". Si vous appelez en fait Info avec un argument différent et que vous vous moquez de l'argument, utilisez plutôt le code suivant:

logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce()); 
33
Michael Liu

Le test est correctement configuré.

Vérifiez votre sut pour voir si Log.Info est appelé dans la méthode DoStuffAndLogInfo.

1
Cristian Lupascu

Cela ne semble pas être le problème de l'affiche originale, mais dans mon cas, j'avais un message d'erreur très similaire. C'était à cause de mon appel .Verify() before de l'exécution réelle. Par exemple, ceci est faux :

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();

.... mais c'est à droite :

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()); 
0