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

c'est un comportement assez simple mais ennuyeux que je rencontre avec NUnit:

j'ai quelques tests de ce genre:

[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 très bien et dans le volet NUnit de ReSharper je peux voir chaque TestCase obtenir sa propre réponse dans le résultat.

j'ai un second 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 d'enfant ont eu des erreurs Exception n'a pas de stacktrace

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

la différence étant qu'avec mes autres tests il dessine chaque TestCase comme une case à cocher séparée sur la liste de test, alors que celle-ci ne s'affiche pas et je n'ai aucun détail jusqu'à ce que je l'exécute dans un débogueur quant à ce qui a mal tourné et où. Je m'inquiète un peu du comportement de ce test sur la machine de construction. Quelqu'un aurait-il une idée de ce qui se passe et pourquoi?

26
demandé sur glenatron 2013-07-29 17:53:08

3 réponses

Suivant ce bug à JetBrains il semble que la solution ici est d'utiliser le TestName attribut sur 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 apparaît maintenant correctement dans ReSharper si un de mes tests échoue.

30
répondu glenatron 2013-07-30 14:24:12

Une alternative est d'utiliser une chaîne de caractères 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();
   ...
}

le bon côté avec cette approche est qu'elle rendra nicly dans le testrunner.

remarque:[Test] n'est pas nécessaire avec

3
répondu Johan Larsson 2016-05-21 15:19:03

pour un tableau qui contient des chaînes, utilisez un object array TestCase attributs:

[Test]
[TestCase(new object[] {"foo", "bar", "baz"})]
[TestCase(new object[] {"300", "500", "700"})]
public void MyClass_SomeOtherMethod(string[] bunchOfStrings)
{
    // assert something...
}
3
répondu Ray Vega 2017-10-05 22:37:50