2010-11-16 18 views
1

J'ai une classe abstraite qui définit certaines méthodes. Cette classe a deux sous-classes.Où devrais-je tester des méthodes sur une classe abstraite?

Devrais-je créer une fausse sous-classe juste pour tester, ou devrais-je tester les méthodes à travers les tests des sous-classes? Test à travers les sous-classes semble plus naturel, mais alors je devrais dupliquer le code de test entre les tests des 2 sous-classes.

Qu'en pensez-vous?

+0

en double de http://stackoverflow.com/questions/104958/testing-abstract-class-concrete-methods – Mark

+0

en double de http://stackoverflow.com/questions/243274/best-practice-unit-testing-abstract -Des classes – Mark

Répondre

3

Vous n'avez pas besoin de dupliquer votre code de test - vous pouvez écrire vos méthodes de test pour qu'elles acceptent un paramètre.

Étant donné que la plupart des environnements de test ne prennent pas en charge les tests prenant des paramètres, vous pouvez ajouter un petit wrapper qui appelle votre méthode de test paramétrée avec une instance spécifique. Vous pouvez maintenant choisir facilement s'il est judicieux d'appeler votre test une seule fois avec une classe de base spécifique, ou d'avoir plusieurs tests de la même méthode - un test pour chacune des classes de base possibles. Comme seule une enveloppe fine doit être ajoutée pour chaque nouveau test, il y a très peu de duplication de code.

void TestSomething(AbstractClass foo) 
{ 
    // Your test code goes here. 
    Assert.AreEqual(42, foo.Bar()); 
} 

[Test] 
void TestSomethingFoo1() 
{ 
    TestSomething(new Foo1()); 
} 

[Test] 
void TestSomethingFoo2() 
{ 
    TestSomething(new Foo2()); 
} 
1

Je choisirais une sous-classe fausse minimale, en l'associant à la classe abstraite. J'aime penser que la classe abstraite est correctement testée, peu importe ce qui arrive à l'une des instanciations concrètes. Cela suppose que le code de la classe Abstract est non trivial et que l'écriture de la fausse classe n'est pas un travail disproportionné - avec des faux-semblants, je pense que ce sera généralement le cas.