webentwicklung-frage-antwort-db.com.de

Überprüfen Sie einen Methodenaufruf mit Moq

Ich bin ziemlich neu in Unit-Tests in C # und lerne die Verwendung von Moq. Unten ist die Klasse, die ich zu testen versuche.

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...
    }
}

Unten ist meine Testklasse:

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

Ich erhalte die folgende Ausnahme:

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

Ich möchte nur überprüfen, ob die Methode "MyMethod" aufgerufen wird oder nicht. Vermisse ich etwas?

Danke im Voraus!

113
user591410

Sie überprüfen die falsche Methode. Moq erfordert, dass Sie die Methode in der Abhängigkeitsklasse einrichten (und optional überprüfen).

Sie sollten etwas ähnliches tun:

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

Mit anderen Worten, Sie verifizieren, dass Ihre Klasse beim Aufruf von MyClass#MyMethod Auf jeden Fall einmal SomeClass#DoSomething Aufruft. Beachten Sie, dass Sie das Argument Times nicht benötigen. Ich habe nur seinen Wert demonstriert.

156
Platinum Azure