2008-11-19 4 views
2

J'ai une classe comme ceci:Est-ce que je peux (ou devrais) simuler des méthodes sur l'objet testé autre que la méthode testée?

public class ClassA 
{ 
    public bool MethodA() 
    { 
     //do something complicated to test requiring a lot of setup 
    } 
    public bool MethodB() 
    { 
     if (MethodA()) 
      //do something 
     else 
      //do something else 
     endif 
    } 
} 

J'ai des tests pour METHODA et que vous souhaitez tester MethodB, mais tout ce que je veux faire est de vérifier que si METHODA retourne vrai que quelque chose arrive et si retourne METHODA faux que quelque chose d'autre se passe. Puis-je le faire avec Rhino Mocks? Ou dois-je configurer tous les mêmes mock que j'ai déjà dans les tests pour MethodA?

Répondre

1

Vous devrez peut-être extraire une interface de la classe ou la rendre abstraite, je suis donc sûr que Rhino.Mocks peut mocker des classes et des interfaces. Ce qui signifie que vous devriez être en mesure de faire quelque chose comme ceci:

ClassA myClass = MockRepository.PartialMock(typeof(ClassA)); 

Expect.Call(myClass.MethodA).Return(true); 

MockRepository.ReplayAll() 
Assert.AreEqual(false, myClass.MethodB()) 
MockRepository.VerifyAll() 

La syntaxe est peut-être un peu loin, mais cela devrait permettre MethodB à tester indépendamment METHODA

+0

Cela fonctionne, mais seulement si la méthode sur la classe étant partiellement mockée est virtuelle. Merci, je savais que ça devait être possible. –

1

Il est difficile de dire si cela est possible sans le contexte, mais une solution pourrait extraire MethodA() à sa propre classe afin que MethodB() puisse invoquer MethodA() sur un objet fantôme qui agira comme votre test d'unité souhaite. Une autre possibilité est de sous-classer ClassA dans votre unité teste et de surcharger MethodA() pour retourner vrai ou faux en fonction de votre test unitaire. Ensuite, lors de vos tests, instanciez ClassAMethodAReturnTrue au lieu de ClassA. Dans les tests, installez ClassAMethodAReturnTrue au lieu de ClassA. Vous allez écrire ClassAMethodAReturnFalse de la même manière.

+0

Donc, fondamentalement, vous dites qu'il est impossible . Je ne veux pas déplacer les méthodes vers d'autres classes ou créer des sous-classes, donc je suppose que je vais devoir mordre le bullit et se moquer à nouveau des appels dans methodA. –

+0

Non, vous pouvez sous-classer ClassA * dans vos tests * juste pour redéfinir MethodA. – philant

+0

Ahh. ok je vous reçois maintenant, désolé. Oui, ce serait une autre approche qui fonctionnerait. Merci. –

Questions connexes