Подтвердить что ты не робот

NUnit не может распознать TestCase, когда он содержит массив

Это довольно простое, но раздражающее поведение, с которым я сталкиваюсь с NUnit:

У меня есть несколько таких тестов:

[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

public void MyClass_MyOtherMethod (5,3, System.Int64 []) не удалось

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

4b9b3361

Ответ 1

Следуя этой ошибке в 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

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

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

Потенциал роста с этим подходом заключается в том, что он будет хорошо отображаться в testrunner.

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

Ответ 3

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

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

Ответ 4

Это работает в VS 2017 с NUnit 3.11.0

[TestCase(new long[] {5, 6, 942135153})]
public void DummyTest(long[] values)
{
    Assert.That(values != null);
}