2013-07-29 14 views
25

Jest to dość proste, ale irytujące zachowanie używam do z NUnit:NUnit nie może rozpoznać TestCase gdy zawiera tablicę

mam kilka testów tak:

[Test] 
[TestCase(1, 2, "hello")] 
[TestCase(3, 5, "goodbye")] 
public void MyClass_MyMethod(int a, int b, string c) 
{ 
    Assert.IsTrue(a < b); 
} 

to działa prawidłowo i okienko NUnit programu ReSharper Widzę, że każdy testcase uzyskuje własną odpowiedź w wyniku.

mam drugą TestCase, który wygląda tak:

[Test] 
[TestCase(1, 2, new long[] { 100, 200 })] 
[TestCase(5, 3, new long[] { 300, 500 })] 
public void MyClass_MyOtherMethod(long a, long b, long[] bunchOfNumbers) 
{ 
    Assert.IsTrue(a < b); 
} 

Gdy go widzę to:

Jeden lub więcej testów dziecko miało błędy wyjątków nie ma StackTrace

void MyClass_MyOtherMethod (5,3, System.Int64 []) nie

Różnica polega na tym, że z innymi testami rysuje każdą testCase jako osobne pole wyboru na liście testowej, podczas gdy ta nie jest pokazywana i nie mam szczegółów, dopóki nie uruchomię go w debugerze, co poszło nie tak i gdzie. Jestem trochę zaniepokojony tym, jak ten test będzie się zachowywać na maszynie budującej. Czy ktoś ma pojęcie, co się dzieje i dlaczego?

+1

może być również zawodnik testowy ReSharper że go nie obsługuje. –

+0

Dobra rada, sprawdzi konsolę NUnit. – glenatron

+0

Jakich wersji NUnit i Resharper używasz? Pamiętam, że niektóre problemy zostały naprawione w późniejszych wersjach jednego z nich. –

Odpowiedz

26

Kontynuując this bug at JetBrains wygląda jakby tu rozwiązaniem jest użycie atrybutu TestName na swoich różnych przypadkach:

[Test] 
[TestCase(1, 2, new long[] { 100, 200 }, TestName="Test 1")] 
[TestCase(5, 3, new long[] { 300, 500 }, TestName="Test 2")] 
public void MyClass_MyOtherMethod(long a, long b, long[] bunchOfNumbers) 
{ 
    Assert.IsTrue(a < b); 
} 

Wszystko pokazuje teraz poprawnie w ReSharper jeśli jeden z moich prób kończy się niepowodzeniem.

+2

Wygląda na to, że przy obecnych wersjach NUnit i ReSharper to obejście nie jest już wymagane. – arni

+3

To nadal nie podoba się, jeśli pierwszym parametrem jest tablica. –

+0

Ale działa, jeśli masz więcej niż jedną tablicę na liście parametrów. – vgaltes

2

Alternatywą jest stosowanie znaków na tablicy:

[TestCase(1, 2, "100, 200")] 
[TestCase(5, 3, "300, 500")] 
public void MyClass_MyOtherMethod(long a, long b, string bunchOfNumbersString) 
{ 
    var bunchOfNumbers= bunchOfNumbersString.Split(',') 
              .Select(long.Parse) 
              .ToArray(); 
    ... 
} 

Zaletą tego podejścia jest to, że czyni Uwielbiiam w TestRunner.

Notatka boczna: [Test] nie jest potrzebna, gdy używana jest [TestCase] lub przynajmniej nie widzę, aby rozwiązała problem.

2

Na tablicy, która zawiera ciągi, użyj object tablicę atrybutów TestCase:

[Test] 
[TestCase(new object[] {"foo", "bar", "baz"})] 
[TestCase(new object[] {"300", "500", "700"})] 
public void MyClass_SomeOtherMethod(string[] bunchOfStrings) 
{ 
    // assert something... 
} 
Powiązane problemy