33

これは非常に単純ですが、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 がテスト リストの個別のチェックボックスとして描画されるのに対し、これは表示されず、デバッガーで実行するまで詳細がわかりません。このテストがビルド マシンでどのように動作するか、少し心配です。誰が何が起こっているのか、そしてその理由を知っていますか?

4

5 に答える 5

35

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 ですべてが正しく表示されるようになりました。

于 2013-07-30T14:24:12.680 に答える
4

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

[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]ません。少なくとも、問題が解決するとは思いません。

于 2016-05-21T15:19:03.603 に答える