2011-08-04 17 views
1

インテグレーションテストを行うためにIOCコンテナをどのように使用するかを完全には理解できていないと思います。インテグレーションテストで使用するIOC登録を無効にする

のは、私はクラスのカップルを持っていると仮定しましょう:

public class EmailComposer : IComposer 
{ 
    public EmailComposer(IEmailFormatter formatter) 
    { 
     ... 
    } 
    ... 
    public string Write(string message) 
    { 
     ... 
     return _formatter.Format(message); 
    } 
} 

OKので、実際のアプリケーション(私はここautofacを使用しています)私はモジュールを作成し、ような何かをしたい時に使用するため:

protected override void Load(ContainerBuilder containerBuilder) 
    { 
     containerBuilder.RegisterType<HtmlEmailFormatter>().As<IEmailFormatter>(); 
    } 

完璧な意味合いを持ち、素晴らしい作品です。

単体テストに関しては、IOCコンテナをまったく使用しないで、テストをしているときにフォーマッタを模倣するだけです。再び素晴らしい作品です。

今OK、それは私の統合テストに来る... 理想的には私は明らかに統合テスト中にフルスタックを実行していることと思いますが、さんはHtmlEmailFormatterは、いくつかの遅い外部のWebサービスであるふりをしましょうので、私はそれがに私の最善の利益にだ決定代わりにTest Doubleを使用してください。 しかし...私はすべての統合テストでTest Doubleを使用したくないだけです。サブセット(実行しやすいスモークテストスタイルテストのセット)です。

この時点で、正しいメソッドがまだ呼び出されていることを検証できるように、Webサービスの模擬バージョンを挿入したいと思います。

だから、本当の問題は:私は複数のパラメータに取るコンストラクタを持つクラスを持っている場合

は、どのように私は(パラメータの一つは、オブジェクトのインスタンスに解決しますか正しく、すなわち、 Mockを設定します)、残りはオートファクトによって生成されますか?

+1

私は統合テストの場合、単体テストの場合と同じことを言います:DIコンテナを使用せず、手動でオブジェクトをインスタンス化します(おそらく、統合テストスイートに組み込まれたファクトリメソッドの助けを借りて)。 – Steven

答えて

1

私はSetUpとTearDown(NUnit)またはClassInitializeとClassCleanup(MSTest)を使用しています。初期化では、一時的なテストクラスを登録し、クリーンアップでは通常の状態に復元します。

DIコンテナにすべての依存関係を指定すると、オブジェクトグラフ全体の依存関係が解決されるという利点があります。しかし、別の実装を使用する単一のテストがある場合は、代わりにMockingフレームワークを使用します。

関連する問題