web-dev-qa-db-fra.com

Utilisation de Moq pour déterminer si une méthode est appelée

D'après ce que j'ai compris, je peux tester qu'un appel de méthode se produira si j'appelle une méthode de niveau supérieur, c'est-à-dire:

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

    internal abstract void SomeOtherMethod();
}

Je veux tester que si j'appelle SomeMethod(), je m'attends à ce que SomeOtherMethod() soit appelé.

Ai-je raison de penser que ce type de test est disponible dans un cadre moqueur?

153
Owen

Vous pouvez voir si une méthode dans quelque chose que vous avez simulé a été appelée en utilisant Verify, par exemple:

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

Si la ligne est laissée commentée, une exception MockException sera émise lorsque vous appelez Verify. S'il n'est pas commenté, cela passera.

181
Paul

Non, les tests de simulation supposent que vous utilisez certains modèles de conception testables, dont l'un est l'injection. Dans votre cas, vous testeriez SomeClass.SomeMethod Et SomeOtherMethod doivent être implémentés dans une autre entité qui doit être interfacée.

Votre constructeur Someclass ressemblerait à New(ISomeOtherClass). Ensuite, vous vous moqueriez du ISomeOtherClass et définiriez l'attente sur son SomeOtherMethod à appeler et vérifieriez l'attente.

6
Val