Comment affirmer une méthode privée sur la classe du béton est appelé (Typemock / NMock / etc ..)?

StackOverflow https://stackoverflow.com/questions/2358712

Question

Je suis en train d'écrire un test unitaire pour la fonction « IsUnique » dans la classe ci-dessous qui ressemble à ceci:

class Foo
{
    public bool IsUnique(params...)
    {
       ValidateStuffExists(params);
       return CheckUniqueness(params);
    }

    private void ValidateStuffExists(params)
    {
      //does some validation
    }

    private bool CheckUniqueness(params)
    {
       //does logic to determine if its unique per params
       return result;
    }

}

La seule chose que je veux tester ici est que ValidateStuffExists et CheckUniqueness est appelé et transmis les arguments. C'est tout cette fonction ne il est tout ce que je vais tester (je vais plier le « test comportement public seulement » pseudo-règle et tester les méthodes privées ici, parce que sa soit ont une grande méthode compliquée / tests ou tests 2 privés méthodes).

Je suis ouvert à toute bibliothèque moqueur. J'utilise NMock et ne pensais pas qu'il était à la tâche - donc je téléchargé Typemock comme je l'ai fait la lecture et entendu que c'était le meilleur et qu'il pouvait se moquer même des classes concrètes / appels méthode non d'interface ...

Je fais quelque chose comme ça dans mon test et il émet une exception à la ligne « Isolate.WhenCalled »:

        CrmEntityUniqueValidator_Accessor target = new CrmEntityUniqueValidator_Accessor(); // TODO: Initialize to an appropriate value
        DynamicEntity entity = null; // TODO: Initialize to an appropriate value
        string[] propertyNames = null; // TODO: Initialize to an appropriate value

        bool tru = true;
        Isolate.WhenCalled(() => target.CheckUniqueness(entity, propertyNames, null, null)).WillReturn(tru);

        target.ValidatePropertiesExist(entity, propertyNames);

        Isolate.Verify.WasCalledWithArguments(() => target.ValidatePropertiesExist(entity, propertyNames));
        Isolate.Verify.WasCalledWithArguments(() => target.CheckUniqueness(entity, propertyNames, null, null));

lève une exception comme "*** WhenCalled ne prend pas en charge un appel de méthode comme un argument."

Même si je suis capable de faire la même chose avec une classe CLR - je peux railler sur DateTime.Now faire (code fonctionne):

        DateTime endOfWorld = new DateTime(2012, 12, 23);
        Isolate.WhenCalled(() => DateTime.Now).WillReturn(endOfWorld);
        DateTime dt = DateTime.Now;

        Assert.AreEqual(dt, endOfWorld);

Quelqu'un at-il des conseils ici? Dois-je diviser ces 2 méthodes dans une classe séparée et faire une interface est la seule façon? ou compliquer ma méthode / tests ??? Il doit y avoir quelque chose que je manque ici ... Merci beaucoup pour toute aide à l'avance.

EDIT: Je suppose que je suis en train de se moquer les 2 méthodes privées dans la classe pour l'un test unitaire. Comment pourrais-je faire cela sans avoir à séparer sur ces 2 méthodes dans une classe séparée / interface?

Était-ce utile?

La solution

essayer Isolate.NonPublic.WhenCalled (objet, "méthode non publique"). IgnoreCall

ou Isolate.Verify.NonPublic.WasCalled (objet, "méthode" ..

Autres conseils

RhinoMocks a le méthode AssertWasCalled qui peut servir dans le but de garantir qu'une méthode appelle une autre méthode ... mais je ne suis pas sûr que vous pouvez le faire sur une fonction privée de la même classe que vous êtes des tests unitaires. Je pense que vous ne pouvez le faire que si les deux méthodes que vous vouliez stub étaient dans une autre classe de dépendance qui a été injectée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top