2010-11-16 12 views
4

J'ai besoin de faire des tests unitaires pour deux classes d'implémentation d'une interface particulière. La classe de test unitaire est générique et couvre tous les tests nécessaires pour l'interface. Je veux instancier la classe d'implémentation dans la méthode TestInitialize de la classe d'unité de test.Test d'unité de studio visuel pour différentes implémentations de l'interface

Y at-il un moyen de forcer l'exécution de la classe de test deux fois avec une instance de classe d'implémentation différente.

[TestClass] 
public class MyFixture 
{ 
    [TestInitialize()] 
    public void MyTestInitialize() 
    { 
     ITest mockInstance = new TestImplement1(); 
     //ITest mockInstance = new TestImplement2(); 
    } 

    [TestMethod] 
    public void Test1() 
    { 
     mockInstance.Func1(); 
     ... 
    } 

    [TestMethod] 
    public void Test2() 
    { 
     ... 
    } 

    ...other unit tests 

} 
+0

Devoir tester quelque chose comme ceci indique qu'il y a un problème avec votre conception. Le code à tester ne doit pas se préoccuper de savoir quel implémenteur spécifique de l'interface est effectivement présent; Si tel est le cas, votre interface est en violation de LSP. –

+2

Ou il indique qu'il veut un moyen pratique de tester plusieurs implémentations d'une interface. –

Répondre

6

Pour ce modèle, généralement vous auriez une classe de test de base avec les méthodes d'essai, et alors vous sous-classe et remplir la méthode d'installation. Ainsi, il deviendrait quelque chose comme ceci: (je l'utilise NUnit, donc je présente mes excuses si les méthodes cadres de test sont un peu hors)

// don't mark this one as TestClass! 
public abstract class MyBaseFixture 
{ 
    protected ITest mockInstance; 

    [TestMethod] 
    public void Test1() 
    { 
     Assert(this.mockInstance.Func1() == 0); 
    } 
} 

[TestClass] 
public class MyConcreteFixture : MyBaseFixture 
{ 
    [TestInitialize] 
    public void Setup() 
    { 
     this.mockInstance = new ConcreteInstance1(); 
    } 
}  

[TestClass] 
public class MyOtherConcreteFixture : MyBaseFixture 
{ 
    [TestInitialize] 
    public void Setup() 
    { 
     this.mockInstance = new ConcreteInstance2(); 
    } 
} 
+0

En aparté, si "mockInstance" est l'objet du test, veuillez ne pas appeler "mock" car "mock" a une signification définie dans le test unitaire. –

+0

Merci Mark, c'est ce que je cherche. – Tao

+0

Problème mineur avec Visual Studio: "TestMethodAttribute peut être défini uniquement dans une classe marquée avec l'attribut TestClass." –