web-dev-qa-db-de.com

Mit Moq bestimmen, ob eine Methode aufgerufen wird

Nach meinem Verständnis kann ich testen, ob ein Methodenaufruf erfolgt, wenn ich eine übergeordnete Methode aufrufe, d. H .:

public abstract class SomeClass()
{    
    public void SomeMehod()
    {
        SomeOtherMethod();
    }

    internal abstract void SomeOtherMethod();
}

Ich möchte das testen, wenn ich SomeMethod() aufrufe, dann erwarte ich, dass SomeOtherMethod() aufgerufen wird.

Bin ich zu Recht der Meinung, dass diese Art von Test in einem spöttischen Rahmen verfügbar ist?

153
Owen

Mit Verify können Sie feststellen, ob eine Methode in etwas, das Sie verspottet haben, aufgerufen wurde, z.

static void Main(string[] args)
{
        Mock<ITest> mock = new Mock<ITest>();

        ClassBeingTested testedClass = new ClassBeingTested();
        testedClass.WorkMethod(mock.Object);

        mock.Verify(m => m.MethodToCheckIfCalled());
}

class ClassBeingTested
{
    public void WorkMethod(ITest test)
    {
        //test.MethodToCheckIfCalled();
    }
}

public interface ITest
{
    void MethodToCheckIfCalled();
}

Wenn die Zeile mit einem Kommentar versehen ist, wird beim Aufruf von Verify eine MockException ausgelöst. Wenn es nicht kommentiert ist, geht es vorbei.

181
Paul

Nein, bei Scheintests wird davon ausgegangen, dass Sie bestimmte testbare Entwurfsmuster verwenden, von denen eines die Injektion ist. In Ihrem Fall würden Sie SomeClass.SomeMethod Testen und SomeOtherMethod muss in einer anderen Entität implementiert werden, die eine Schnittstelle benötigt.

Ihr Someclass -Konstruktor würde wie New(ISomeOtherClass) aussehen. Dann würden Sie das ISomeOtherClass verspotten und die Erwartung auf das aufzurufende SomeOtherMethod setzen und die Erwartung überprüfen.

6
Val