175 votes

Vérifier un appel de méthode à l'aide de Moq

Je suis assez nouveau dans les tests unitaires en C# et j'apprends à utiliser Moq. Voici la classe que j'essaie de tester.

 class MyClass
{
    SomeClass someClass;
    public MyClass(SomeClass someClass)
    {
        this.someClass = someClass;     
    }

    public void MyMethod(string method)
    {
        method = "test"
        someClass.DoSomething(method);
    }   
}

class Someclass
{
    public DoSomething(string method)
    {
        // do something...
    }
}

Ci-dessous, ma classe de test :

 class MyClassTest
{
    [TestMethod()]
    public void MyMethodTest()
    {
        string action="test";
        Mock<SomeClass> mockSomeClass = new Mock<SomeClass>();
        mockSomeClass.SetUp(a => a.DoSomething(action));
        MyClass myClass = new MyClass(mockSomeClass.Object);
        myClass.MyMethod(action);
        mockSomeClass.Verify(v => v.DoSomething(It.IsAny<string>()));
    }
}

J'obtiens l'exception suivante :

 Expected invocation on the mock at least once, but was never performed
No setups configured.
No invocations performed..

Je veux juste vérifier si la méthode "MyMethod" est appelée ou non. Est-ce que j'ai raté quelque chose ?

261voto

Platinum Azure Points 22380

Vous vérifiez la mauvaise méthode. Moq nécessite que vous configuriez (puis que vous vérifiiez éventuellement) la méthode dans la classe de dépendance.

Tu devrais plutôt faire quelque chose comme ça :

 class MyClassTest
{
    [TestMethod]
    public void MyMethodTest()
    {
        string action = "test";
        Mock<SomeClass> mockSomeClass = new Mock<SomeClass>();

        mockSomeClass.Setup(mock => mock.DoSomething());

        MyClass myClass = new MyClass(mockSomeClass.Object);
        myClass.MyMethod(action);

        // Explicitly verify each expectation...
        mockSomeClass.Verify(mock => mock.DoSomething(), Times.Once());

        // ...or verify everything.
        // mockSomeClass.VerifyAll();
    }
}

En d'autres termes, vous vérifiez qu'en appelant MyClass#MyMethod , votre classe appellera certainement SomeClass#DoSomething une fois dans ce processus. Notez que vous n'avez pas besoin de l'argument Times Je démontrais juste sa valeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X