3

すべての DTO と DOMAIN オブジェクトをテストするために、抽象クラスのようなものを作成する予定です。このクラスは、テンプレート化可能なオブジェクト (ジェネリック型) を受け取り、リフレクションを使用して内部のプロパティの型を取得し、識別されたプリミティブ型にいくつかの既定値を割り当て、後でそれらにアクセスしてこれらの型の値をアサートします。このように、私の DTO テストがこのクラスを継承するときはいつでも、ほとんどのコードは、テストに記述された 1 行のコードでテストされます。これは単なるアイデアであり、このようなものが既に存在する場合、私が車輪を再発明するかどうかを皆さんから知りたいですか? DTO とドメイン オブジェクトをより少ない再利用可能なコードでテストするより良い方法がある場合。

4

3 に答える 3

4

これは Domain オブジェクトをテストするための良いアプローチだとは思いません。定義上、これらのオブジェクトはデータと関連する動作をカプセル化し、getter と setter を備えた単なるデータ コンテナー以上のものであると想定されます。オブジェクト自体を手書きしたのと同じように、これらのオブジェクトの単体テストを手書きする必要があります。これは、DDD によると、実際に時間を費やしていると思われる場所です。

DTO に関しては、この質問を参照してください。

于 2012-05-08T22:37:10.850 に答える
1

私のアドバイス:

  • DTO を単体テストしないでください。これらは、一連のゲッターとセッターを備えた単純なデータ構造であり、動作はありません。ゲッターとセッターは、テストするにはあまりにも馬鹿げています (DTO ではめったにない何らかの条件付きロジックをカプセル化している場合を除きます)。

  • ドメイン オブジェクト テストを自動化または汎用化しようとしないでください。いずれにせよ、動作をテストするコードをどのように再利用できるかわかりません。それらはすべて定義上異なる動作をするからです。

于 2012-05-09T13:21:02.967 に答える
0

@Dmitryの回答に基づいて、DTOを単体テストする価値はないと思いますが、このクラスを思いつきました:

[TestClass]
public class PeopleTest
{
    [TestMethod]
    public void OneObjectNull()
    {
        Person obj1 = null;
        var obj2 = new Person
        {
            Id = "101",
            Name = "George Waits",
            Address = "Lake Palmer 10"
        };

        Assert.AreNotEqual(obj1, obj2);
        Assert.AreNotEqual(obj2, obj1);
    }

    [TestMethod]
    public void DeepEqual()
    {
        var obj1 = new Person
        {
            Id = "101",
            Name = "George Waits",
            Address = "Lake Palmer 10"
        };

        var peolpleList1 = new List<Person> { obj1 };
        var peolpleList2 = new List<Person> { obj1 };

        Assert.AreEqual(obj1, obj1);
        CollectionAssert.AreEqual(peolpleList1, peolpleList2);
    }

    [TestMethod]
    public void DeepNotEqual()
    {
        var obj1 = new Person
        {
            Id = "101",
            Name = "George Waits",
            Address = "Lake Palmer 10"
        };

        var obj2 = new Person
        {
            Id = "102",
            Name = "Rachel Smith",
            Address = "Lake Palmer 10"
        };

        var peolpleList1 = new List<Person> { obj1 };
        var peolpleList2 = new List<Person> { obj2 };

        Assert.AreNotEqual(peolpleList1, peolpleList2);

        var group1 = new KeyValuePair<string, List<Person>>("group1", peolpleList1);
        var group2 = new KeyValuePair<string, List<Person>>("group2", peolpleList2);

        Assert.AreNotEqual(group1, group2);
    }

    [TestMethod]
    public void PropertyPositive()
    {
       var obj1 = new Person
        {
            Id = "101",
            Name = "George Waits",
            Address = "Lake Palmer 10"
        };
        obj1.Address = "Parker av 101";

        var obj2 = new Person
        {
            Id = "102",
            Name = "Rachel Smith",
            Address = "Lake Palmer 10"
        };
        obj1.Address = "Listener av 45";

        Assert.AreNotEqual(obj1, obj2);
    }
}
于 2016-12-23T10:04:44.387 に答える