2011-01-12 37 views
7

私はASP.NET MVCコントローラメソッドの単体テストを書いています。ユニットテストでAutoMapperを使用する必要がありますか?

コントローラはIMapperに依存しています。これは、AutoMapperを抽象化するために作成したインターフェイスで、Castle Windsorを使用してコンストラクタインジェクションによって渡されました。

アクションメソッドは、ドメインオブジェクトからViewModelオブジェクトにマップし、再びDRYを維持し、アクションメソッドを簡潔に保つことを目的として、IMapperを使用します。私のユニットテストで

は、I正しいバインディングと

  1. 設定AutoMapper(彼らは、そのテスト可能とウェブサイトとのユニットテストプロジェクト間で再利用可能なAutoMapperプロファイルを使用して構築されている)とは、としてそれを渡す必要があります適切なAutoMapperの実装はIMapperです。モックオブジェクトで

  2. パステストに応じて、IMapper例えば(私は部品番号を使用しています)(これはモックマッパーから返されるオブジェクトはに関連することを確認するテスト・セットアップコードにいくつかの作業を複製する意味しますモックマッパーがマップしようとしているオブジェクト)。

  3. それぞれのテストで必要と思われるマッピングを手動で設定するAutoMapper(多くの作業と、実際に使用されるマッピングをテストしていないことを意味します)。

ユニットテストでインフラストラクチャコードを使用することについての意見は?どの時点で統合テストになりますか(つまり、AutoMapperとコントローラの統合テストですか?)

私はMoqについてもっと学ぶ必要があると思いますが、実際の値に関連する値を返すようにする必要があると思いますが、2が純粋なビューだと感じます。

答えて

6

私は#2に同意する傾向があります。あなたはオートマッパの仕事を知っています、あなたは注射の仕事を知っています(そのようなテストはありますか?))私は、特定のものだけに焦点を当てます。SomeClass.Property = AnotherClass.Property - 基本的なコピー機能フレームワークをテストしないでください。

さらに多くのテストコードについて - 私はそれが完全にokだと感じます。テストは、与えられたユニットのためだけに、与えられたテスト内で(また理由のもとで)セットアップされるべきです。

Moqに関しては、構文は簡単ですが、考えすぎないでください。 var obj = new Mock();もっと具体的な問題がなければ、obj.Setup(x => x.Property).returns( "hello")のようなプロパティを設定します。 Moqもそれにすべてのプロパティを設定しているので、オートマッペも必要ないかもしれません。

-edit-見つかりました、それはobj.SetupAllProperties()です。

4

私は部品番号に追加jeriley

のような#2の賛成よ、あなたがそれに渡された値に基づいてオブジェクトを返す必要がある場合、あなたはそのようなあなたのセットアップを書き込むことができます。

mockObject.Setup(x => x.MapObject(It.IsAny()) 
      .Returns((ProductDto productDto) => 
      { 
       var product = new Product() 
       { 
        Id = productDto.Id, 
        Name = productDto.Name 
       }; 

       return product 
      });

ほんの少し厄介ですが便利です。

+0

リポジトリパターンを使用している場合、私はあなたを指してもいいですか?http://rileytech.net/post/2010/08/17/Mock-Utility-creating-those-basic-services.aspx - - 最後の2つのファイルを使用するか、完全な例として使用してください:-) – jeriley

関連する問題