0

人気のある質問のようですが、まだ答えが見つかりません。

unit test簡単に言うと、実行する必要のあるジェネリック関数があります。

public void T[] DoSomething<T>(T input1, T input2)

ここで、この関数がint、ArrayListに対して正しく機能するかどうかをテストする必要があります。この場合、ユニットテストを作成するにはどうすればよいですか。Tのすべてのケースを一覧表示することはできません。intといくつかのクラスインスタンスをテストすることを考えていますか?

また、VS2012から自動生成された単体テストを使用しようとしています。次のようになります。

public void DoSomethingHelper<T>() {
    T item1 = default(T);; // TODO: Initialize to an appropriate value
    T item2 = default(T); // TODO: Initialize to an appropriate value
    T[] expected = null; // TODO: Initialize to an appropriate value
    T[] actual = SomeClass.DoSomething<T>(item1, item2);
    Assert.AreEqual(expected, actual);
    Assert.Inconclusive("Verify the correctness of this test method.");
}
[TestMethod()]
public void AddTest() {
    AddTestHelper<GenericParameterHelper>();
}

これは私にとってさらに混乱しますが、変数を初期化するためにDoSomethingHelperに何を入れる必要がありますか?int、文字列、または何か?

誰か助けてもらえますか?Pexなどのことは聞いたことがありますが、この単純な関数のサンプルユニットテストコードを提供してくれた人はまだいません。

4

1 に答える 1

4

の複数の実装でテストするために、NUnit の Generic Test Fixturesを確認することをお勧めします。T

まず、次のことを考えてみてください。なぜその関数ジェネリックを作成するのですか?

ジェネリック関数/メソッドを作成している場合は、使用している型の実装を気にする必要はありません。where T : IComparable<T>, new()つまり、ジェネリッククラスで指定したもの(たとえば、など)以上のものはありません

したがって、私の提案は、ジェネリック型の要件に適合するダミー クラスを作成し、それでテストすることです。使用例NUnit:

class Sample {
    //code here that will meet the requirements of T
    //(eg. implement IComparable<T>, etc.)
}

[TestFixture]
class Tests {

    [Test]
    public void DoSomething() {
        var sample1 = new Sample();
        var sample2 = new Sample();
        Sample[] result = DoSomething<Sample>(sample1, sample2);

        Assert.AreEqual(2, result.Length);
        Assert.AreEqual(result[0], sample1);
        Assert.AreEqual(result[1], sample2);
    }
}

編集: 考えてみると、うまくいくことがわかります。あなたは思うかもしれません: "まあ、でも の本体DoSomethingが次のようなものだったら... ":

if (item1 is int) {
    //do something silly here...
}

もちろん、 でテストすると失敗しintますが、クラスでテストしているので気付かないでしょうがSample、2 つの数値を合計する関数をテストしているかのように考えてください。

if (x == 18374) {
    //do something silly here...
}

あなたもそれを識別しません。

于 2013-03-02T04:24:34.180 に答える