2012-05-08 14 views
3

すべての私のDTOとDOMAINオブジェクトをテストするための抽象クラスのものを書くつもりです。このクラスはテンプレート可能オブジェクト(ジェネリック型)を取り込み、リフレクションを使用してプロパティの型を取得し、特定されたプリミティブ型にいくつかのデフォルト値を割り当て、後でアクセスすることによってこれらの型の値をアサートします。この方法で私のDTOテストがこのクラスを継承するたびに、ほとんどのコードがテストで書かれたコードの1行でテストされます。これは単なるアイデアであり、もし私がこのようなものが既に存在するなら、私が車輪を再発明しているかどうかをあなたからすべて知りたいのですか? DTOとドメインオブジェクトをコードの数が少なく再現性のあるものでテストするより良い方法がある場合。ユニットテストのドメインオブジェクトとドメインオブジェクト

+2

私が正しくあなたを理解している場合、あなたがマッピングかどうかをテストしてみてくださいdomainobjectとdtoが完了した、つまり属性の欠落/消失はありません。質問にプログラミング言語を追加すると、すでに解決策が存在する可能性があります。あなたが多くのdtos(> 20)を持っているならば、私の経験から。あなたのtestapiは、変換から除外されるプロパティと、異なるかもしれないコレクションの順序を考慮する必要があります – k3b

+0

データ構造ではなく動作をテストする必要があります。DTOはデータ構造です。ちょうど何らかの動作で状態を変更する集計メソッドをテストする必要がありますもし、あなたがそれらをテストする必要があると感じたら、それらを生成するためにプロジェクトlombokのようなライブラリを使うことをお勧めします。 – rascio

答えて

3

これは、ドメインオブジェクトのテストには適していないと思います。定義上、これらのオブジェクトはデータと関連する動作をカプセル化し、ゲッターとセッターを持つ単なるデータコンテナ以上のものであると考えられます。手作業でオブジェクトを手書きしたのと同じように、これらのオブジェクトの単位テストを書く必要があります。これは、実際にDDDに従って時間を費やしていると思われる場所です。

DTOについては、questionをご覧ください。

+0

私はDomainオブジェクトテストについて同意します。もう少し小さな質問です。私のDomainオブジェクトのほんの一部が取得/設定されている場合、DTOとしても使用できます。 Webサービスのさまざまなケースで、ドメインオブジェクトをdtoとして使用できますか。 – user1383012

+0

ドメインオブジェクトは、Webサービスコンシューマーをドメインオブジェクトに結合するため、DTOとしてドメインオブジェクトを使用しません。これにより、Webサービスクライアントに影響を与えずにドメインを展開したい場合に問題が発生します。 – Dmitry

1

私のアドバイス:

  • がないユニットテストDTOのですか。これらは単純なデータ構造であり、ゲッターとセッターがたくさんあり、動作もありません。ゲッターとセッターは、(DTOではまれなことである種の条件付きロジックをカプセル化しない限り)テストするにはあまりにも愚かです。

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

    私はこのクラスを思い付い@ドミトリーの回答に基づいて、一種の価値のないユニットテストのDTOにあると思いにもかかわらず
1

[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); 
    } 
} 
関連する問題