web-dev-qa-db-fra.com

NUnit ne peut pas reconnaître un TestCase quand il contient un tableau

C'est un comportement assez simple mais ennuyant que je rencontre avec NUnit:

J'ai des tests comme celui-ci:

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

Cela fonctionne bien et dans le volet ReSharper NUnit, je peux voir chaque TestCase obtenir sa propre réponse dans le résultat.

J'ai un deuxième TestCase qui ressemble à ceci:

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

Quand je le lance, je vois ceci:

Un ou plusieurs tests enfants ont eu des erreurs Exception n'a pas de pile

public void MyClass_MyOtherMethod (5,3, System.Int64 []) a échoué

La différence est que, avec mes autres tests, chaque cas TestCase est dessiné comme une case à cocher séparée dans la liste des tests, alors que celui-ci n'est pas affiché et que je n'ai aucun détail à ce sujet avant de le lancer dans un débogueur pour savoir ce qui a mal tourné et où. Je suis un peu préoccupé par la façon dont ce test se comportera sur la machine de compilation. Est-ce que quelqu'un a une idée de ce qui se passe et pourquoi?

26
glenatron

Suite à ce bogue chez JetBrains , il semble que la solution consiste à utiliser l'attribut TestName dans vos différents cas

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

Tout s'affiche maintenant correctement dans ReSharper si l'un de mes tests échoue.

30
glenatron

Une alternative consiste à utiliser une chaîne pour le tableau:

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

L'avantage de cette approche est qu'elle rendra bien le testrunner.

Note latérale: Le [Test] n'est pas nécessaire lors de l'utilisation de [TestCase] ou du moins, je ne vois pas qu'il résoud le problème.

3
Johan Larsson

Pour un tableau contenant des chaînes, utilisez un tableau object avec les attributs TestCase:

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

Cela fonctionne dans VS 2017 avec NUnit 3.11.0

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