web-dev-qa-db-ja.com

配列が含まれていると、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が結果で独自の応答を取得しているのがわかります。

次のような2番目の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 );
}

実行すると、次のようになります。

1つ以上の子テストでエラーが発生しました例外にスタックトレースがありません

public void MyClass_MyOtherMethod(5,3、System.Int64 [])が失敗しました

違いは、他のテストでは、各TestCaseをテストリストの個別のチェックボックスとして描画することですが、これは表示されず、何がどこでどこで問題があったかをデバッガーで実行するまで詳細がありません。このテストがビルドマシンでどのように動作するかについて少し心配しています。誰かが何が起こっているのか、そしてその理由を知っていますか?

29
glenatron

次に続く 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 );
}

テストの1つが失敗した場合、ReSharperですべてが正しく表示されるようになりました。

32
glenatron

別の方法は、配列に文字列を使用することです:

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

このアプローチの利点は、テストランナーでうまく表示されることです。

補足:[Test]を使用する場合、[TestCase]は必要ありません。または、少なくとも問題が解決することはわかりません。

4
Johan Larsson

文字列を含む配列の場合、object属性を持つ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

これはNUnit 3.11.0のVS 2017で動作します

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