10

私は NUnit を使用しており、次のメソッドのテストを実装しようとしています: 2 つの整数を受け入れ、2 次元配列を返す必要があります。したがって、私のテストのヘッダーは次のようになります。

[TestCase(5, 1, new int[,]{{1}, {2}, {3}, {4}, {5}})]
public void MyTestMethod(int a, int b, int[][] r)

コンパイル中に次のエラーが発生しました。

エラー CS0182: 属性引数は、属性パラメーター型の定数式、typeof 式、または配列作成式である必要があります (CS0182)


TestCaseSource次の質問への回答のように、オブジェクト配列を参照するために使用できることを知っています。

次のようなコードが得られます。

private object[][] combination_tests =  new [] {
    new object[] {5, 1, new [,]{{1}, {2}, {3}, {4}, {5}}},
};

[Test]
[TestCaseSource("combination_tests")]
public void MyTestMethod(int a, int b, int[,] r)

しかし、私はまだ質問があります:TestCase属性のみを使用してそれを行うことは可能ですか?

4

2 に答える 2

5

メソッドに同じ署名を付けることが絶対に必要ですか。つまり、

public void MyTestMethod(int a, int b, int[][] r)
{
    // elided
}

状況に応じて、2 つのオプションを利用できます。どちらも[TestCase]、質問で希望したとおりに属性を使用します。

TestCase属性のみを使用してそれを行うことは可能ですか?

より簡潔に感じるので、最初のオプションを好みますが、どちらもニーズに合っています。


オプション 1: 同じ署名を保持する必要がない場合

署名をわずかに変更して、配列(コンパイル時の定数ではない)の代わりに、代わりに配列を取得するために使用できる文字列(コンパイル時の定数)を渡すことができます。

private static int[][] getArrayForMyTestMethod(string key)
{
    // logic to get from key to int[][]
}

[TestCase(5, 1, "dataset1")]
public void MyTestMethod(int a, int b, string rKey)
{
    int[][] r = getArrayForMyTestMethod(rKey);
    // elided
}

オプション 2: 同じ署名を保持する必要がある場合

メソッドに同じ署名を保持する必要がある場合は、オプション 1 と同じことを行うラッパー メソッドを使用できます。

private static int[][] getArrayForMyTestMethod(string key)
{
    // logic to get from key to int[][]
}

[TestCase(5, 1, "dataset1")]
public void MyTestMethodWrapper(int a, int b, string rKey)
{
    int[][] r = getArrayForMyTestMethod(rKey);
    MyTestMethod(a, b, r);
}

public void MyTestMethod(int a, int b, int[][] r)
{
    // elided
}

string明らかに、テストケースの構築方法に応じて、コンパイル時定数の代わりに任意の型を使用できますが、NUnit ランナーでテストケースに名前stringを付けることができるため、 a を提案しました。 .


それ以外の場合は、質問で述べたように使用すること[TestCaseSource]をお勧めします。

于 2015-04-21T06:38:08.607 に答える
4

testcasedata オブジェクトを使用して結果を渡すことができます

    public IEnumerable<TestCaseData> combination_tests()
        {
          yield return new TestCaseData(5,1,new int[,] {{1}, {2}, {3}, {4}, {5}});
        }

    [Test]
    [TestCaseSource("combination_tests")]
    public void test(int a, int b, int[,] r)
        {

            Console.WriteLine(r[0,0] & r[1,0]);

        }

.SetName("xxx") または .SetCategory("xxx") を使用して、各 testCaseData 項目のテスト カテゴリとテスト名を設定することもできます。これは、テストの整理に役立ちます。

于 2015-04-20T16:29:26.197 に答える