2013-08-28 16 views
10

Zasadniczo chcę mieć możliwość podłączania metod do TestCase lub TestFixture w NUnit, aby zmienić zachowanie. W istocie chcę, aby to zrobić:Czy istnieje sposób przekazywania uczestników do NUnit TestCase lub TestFixture?

[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(); 
    } 
} 

błędów wrócę do [TestCase (A, B, C)] są

  • Błąd 6 Argument 1: nie można przekonwertować z 'grupy metoda' na „obiekt”
  • błędu 7 Argument 2: nie można przekształcić z „grupy metody” na „obiekt”
  • błędów 8 Argument 3: nie można przekształcić z „grupy metody” na „obiekt”

Czy wiesz, czy istnieje jakiś sposób, aby to lub coś podobnego działało?

Odpowiedz

15

To tutaj TestCaseSourceAttribute przychodzi na ratunek.

Najpierw należy zdefiniować tablicę obiektów zawierającą listę przypadków testowych. Następnie wywołaj przypadki testowe, odwołując się do tablicy obiektów jako Test 's . Powinno to zostać zbudowane i uruchomione zgodnie z oczekiwaniami.

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(); 
} 

Jeśli potrzebujesz bardziej złożonego listę argumentów, można na przykład użyć Tuple zamiast SimpleDelegate[] stworzyć silnie wpisane listy argumentów.

2

Opierając się na drobnym odpowiedź Andersa:

Można użyć typu NUnit TestCaseData zamiast tablicy Delegatów.

Ma to kilka zalet. Po pierwsze, możesz przekazać parametry wielu typów do metody testowej. (W tym przypadku nie było to potrzebne, ale było pomocne w moim przypadku.) Po drugie, możesz dodać kolejne właściwości do obiektu TestCaseData. W moim przypadku użyłem .SetName, aby dodać nazwę do każdego przypadku testowego, aby GUI NUnit jednoznacznie wskazywało uruchomioną sprawę testową. Zmodyfikować przykładowe Andersa:

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(); 
} 

Jak wspomniano Anders można stosować krotek wspierać bardziej złożoną listę argumentów; ale mój projekt jest w .Net 3.5, który nie obsługuje krotek.

Powiązane problemy