web-dev-qa-db-fra.com

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

Je suis assez nouveau pour les tests unitaires en C # et pour apprendre à utiliser Moq. Vous trouverez ci-dessous 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 TestClass:

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

Je reçois 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 je manque quelque chose?

Merci d'avance!

113
user591410

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

Vous devriez faire quelque chose de plus semblable à ceci:

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 que si vous appelez 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 viens de démontrer sa valeur.

156
Platinum Azure