2013-07-29 2 views
25

Это довольно простой, но некорректное поведение я бегу в с NUnit:NUnit не может распознать TestCase, когда он содержит массив

У меня есть некоторые тесты, как это:

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

Это прекрасно работает и в в панели ReSharper NUnit я могу увидеть, как каждый TestCase получает свой собственный ответ в результате.

У меня есть второй TestCase, который выглядит следующим образом:

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

Когда я запускаю его я вижу это:

один или несколько дочерних тестов были исключения ошибок не имеет StackTrace

общественного недействительными MyClass_MyOtherMethod (5,3, System.Int64 []) не

Разница заключается в том, что с моими другими тестами он выделяет каждую TestCase как отдельный флажок в тестовом списке, тогда как этот не отображается, и у меня нет деталей, пока я не запустил его в отладчике относительно того, что пошло не так и где. Меня немного беспокоит, как этот тест будет вести себя на машине сборки. Кто-нибудь знает, что происходит и почему?

+1

также может быть тест ReSharper бегун, который не поддерживает его. –

+0

Хорошая точка, проверит консоль NUnit. – glenatron

+0

Какие версии NUnit и Resharper вы используете? Я помню, что некоторые проблемы были исправлены в более поздних версиях одного из них. –

ответ

26

Вслед за this bug at JetBrains это выглядит, как если бы решение здесь использовать атрибут TestName на ваших различных случаях:

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

Все теперь правильно показывает в ReSharper, если один из моих тестов не удается.

+2

Похоже, что с текущими версиями NUnit и ReSharper это обходное решение больше не требуется. – arni

+3

Это все еще не нравится, если ваш первый параметр - это массив. –

+0

Но он работает, если в списке параметров имеется несколько массивов. – vgaltes

2

Альтернативой является использование строки для массива:

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

Достоинством такого подхода заключается в том, что он будет оказывать nicly в TestRunner.

Сторона примечания: [Test] не требуется при использовании [TestCase] или, по крайней мере, я не вижу, что он решает проблему.

2

Для массива, который содержит строки, используйте object массив с TestCase атрибутами:

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