2013-07-29 23 views
25

Questo è abbastanza semplice, ma il comportamento fastidioso sto funzionando in essere con NUnit:NUnit non può riconoscere un TestCase quando contiene una serie

ho alcuni test come questo:

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

Questo funziona bene e in il pannello ReSharper NUnit Posso vedere ogni TestCase ottenere la propria risposta nel risultato.

Ho una seconda TestCase che assomiglia a questo:

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

quando l'eseguo vedo questo:

uno o più test bambino aveva gli errori di eccezione non ha uno stacktrace

public void MyClass_MyOtherMethod (5,3, System.Int64 []) non è riuscito

La differenza è che con i miei altri test disegna ogni TestCase come una checkbox separata nella lista dei test, mentre questa non viene mostrata e non ho dettagli finché non la eseguo in un debugger su cosa è andato storto e dove. Sono un po 'preoccupato di come questo test si comporterà sulla macchina da costruzione. Qualcuno ha idea di cosa sta succedendo e perché?

+1

potrebbe anche essere il test runner ReSharper che non lo supporta. –

+0

Buon punto, controllerà la console NUnit. – glenatron

+0

Quali versioni di NUnit e Resharper usi? Ricordo che alcuni problemi erano stati risolti in versioni più recenti di uno di essi. –

risposta

26

Sulla scia this bug at JetBrains sembra come se la soluzione è quella di utilizzare l'attributo TestName sui vostri diversi casi:

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

Tutto ora mostra correttamente in ReSharper se uno dei miei test fallisce.

+2

Sembra che con le versioni correnti di NUnit e ReSharper questa soluzione alternativa non sia più necessaria. – arni

+3

Ancora non gli piace se il tuo primo parametro è l'array. –

+0

Ma funziona se si dispone di più di un array nell'elenco dei parametri. – vgaltes

2

Un'alternativa è quella di utilizzare una stringa per la matrice:

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

Il vantaggio di questo approccio è che renderà nicly nel testrunner.

Nota a margine: il [Test] non è necessario quando si utilizza [TestCase] o almeno non vedo che risolve un problema.

2

Per una matrice che contiene le stringhe, utilizzare un object array con i TestCase attributi:

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