2013-08-28 2 views
10

Fondamentalement, je veux être en mesure de plug-in méthodes à un TestCase ou TestFixture dans NUnit pour faire varier le comportement. Essentiellement, je veux faire:Existe-t-il un moyen de transmettre des délégués à un TestCase ou à un TestFixture de NUnit?

[TestFixture] 
public class MethodTests 
{ 
    public delegate void SimpleDelegate(); 

    public static void A() 
    { 
     // Do something meaningful 
    } 

    public static void B() 
    { 
     // Do something meaningful 
    } 

    public static void C() 
    { 
     // Do something meaningful 
    } 

    [TestCase(A,B,C)] 
    [TestCase(C,A,B)] 
    [TestCase(C,B,A)] 
    public void Test(SimpleDelegate action1, SimpleDelegate action2, SimpleDelegate action3) 
    { 
     action1(); 
     action2(); 
     action3(); 
    } 
} 

Les erreurs que je reçois de retour pour [TestCase (A, B, C)] sont

  • Erreur 6 Argument 1: ne convertit pas 'groupe méthode' pour « objet »
  • erreur 7 Argument 2: ne peut pas convertir les « groupe de procédé » à « objet »
  • erreur 8 Argument 3: ne peut pas convertir les « groupe de procédé » à « objet »

Savez-vous s'il y a un moyen de faire fonctionner ça ou quelque chose comme ça?

Répondre

15

C'est là que le TestCaseSourceAttribute vient à la rescousse.

D'abord, définissez un tableau d'objets contenant votre liste de cas de test. Ensuite, invoquez les cas de test en faisant référence au tableau d'objets en tant que Test. Cela devrait se construire et fonctionner comme prévu.

private static readonly object[] TestCases = 
{ 
    new SimpleDelegate[] { A, B, C }, 
    new SimpleDelegate[] { C, A, B }, 
    new SimpleDelegate[] { C, B, A } 
}; 

[Test, TestCaseSource("TestCases")] 
public void Test(SimpleDelegate action1, SimpleDelegate action2, 
       SimpleDelegate action3) 
{ 
    action1(); 
    action2(); 
    action3(); 
} 

Si vous avez besoin d'une liste d'arguments plus complexes, vous pouvez par exemple utiliser Tuple au lieu de SimpleDelegate[] pour créer des listes d'arguments fortement typés.

2

bâtiment sur belle réponse de Anders:

Vous pouvez utiliser le type NUnit TestCaseData au lieu de l'ensemble des délégués.

Ceci présente un certain nombre d'avantages. D'abord, vous pouvez passer des paramètres de plusieurs types à la méthode de test. (Pas nécessaire dans ce cas, mais c'était utile dans mon cas.) Deuxièmement, vous pouvez ajouter d'autres propriétés à l'objet TestCaseData. Dans mon cas, j'ai utilisé .SetName pour ajouter un nom à chaque cas de test afin que l'interface graphique de NUnit identifie clairement le cas de test en cours d'exécution. Pour modifier l'exemple de Anders:

private static readonly object[] TestCases = 
{ 
    new TestCaseData(A, B, C).SetName("A B C"), 
    new TestCaseData(C, A, B).SetName("C A B"), 
    new TestCaseData(C, B, A).SetName("C B A") 
}; 

[Test, TestCaseSource("TestCases")] 
public void Test(SimpleDelegate action1, SimpleDelegate action2, SimpleDelegate action3) 
{ 
    action1(); 
    action2(); 
    action3(); 
} 

Comme Anders mentionne, on peut utiliser Tuples pour soutenir une liste d'arguments plus complexes; mais mon projet est en .Net 3.5 qui ne supporte pas Tuples.

Questions connexes