2009-09-23 8 views
92

ユニットテストにはどのようにIoCコンテナを使用できますか? IoCを使用して、巨大なソリューション(50以上のプロジェクト)でモックを管理すると便利ですか?どんな経験ですか?単体テストで使うのにうまくいくC#ライブラリ?ユニットテストにIoCを使用する

+7

@マークセマンはあまりにも謙虚だが、この質問に興味があれば、少なくとも[AutoFixture](http://autofixture.codeplex.com)に気づくべきである。 –

+0

良いことがあるMiguel CastroのDIとMockingの関係について話をする:https://vimeo.com/68390510 – GregC

答えて

118

一般的に言えば、単体テストはすべて責任の分離に関するものであるため、DIコンテナは単体テストには必要ありません。

は、アプリケーション全体ではコンストラクタ・インジェクション

public MyClass(IMyDependency dep) { } 

を使用するクラスを考えてみましょう、それがグラフIMyDependencyの後ろに隠れて巨大な依存関係があることかもしれないが、ユニットテストでは、あなたは、単一にまでそれをすべてフラット化Test Double

MoqやRhinoMockのような動的モックを使用してTest Doubleを生成することはできますが、必須ではありません。いくつかのケースでは

var dep = new Mock<IMyDependency>().Object; 
var sut = new MyClass(dep); 

auto-mocking containerがあると便利にすることができますが、本番アプリケーションが使用するのと同じDIコンテナを使用する必要はありません。

+12

...テスト対象にIoCコンテナが*依存していない限り、あなたのテストでは必要ないはずです。単体テストを行うときにオブジェクトグラフの大部分を削除します。 –

+3

@マーク・シーマンこれは意味があります...しかし、統合テストはどうですか?私はUIテストで遊んでいました。構成ルートを共有しなければならない状況に直面しました。コメントはありますか? –

+3

@Arnis L .:統合テストの重要性は低いです。 DIコンテナを使用してコンポーネントを配線することもできますが、その場合は、皮下テストまたは完全なシステムテストを実行しない限り、コンテナの構成がフルアプリケーションとは異なる可能性がありますアプリケーションのコンテナ構成を再利用できます。 –

15

単体テストにはどのようにIOCコンテナを使用できますか?

のIoCが簡単に(すなわちモックを使用して)単独でユニットテストを行いますプログラミングパラダイムを強制します:インターフェースの使用は、新しい()、なしシングルトン...

しかし、テストのためのIoCコンテナを使用して実際には要件ではない、それはちょうどいくつかの施設を提供するモックの注入が、手動で行うことができます。

IoCを使用して、巨大なソリューション(50以上のプロジェクト)でモックを管理すると便利ですか?

IoCを使用してモックを管理することがどういう意味なのですか?とにかく、IoCのコンテナは、通常、テストの際にモックを注入するだけではありません。リファクタリングを可能にするまともなIDEサポートがあれば、なぜそれを使用しないのですか?

はい、巨大なソリューションでは、エラーが発生しにくく、リファクタリングの面で優れたソリューションが必要です(タイプセーフなIoCコンテナまたはIDEの優れたサポート)。

13

私はテストでIoCコンテナを使用することがよくあります。確かに、彼らは純粋な意味での単体テストではありません。 IMO彼らはより多くのBDDがあり、リファクタリングを容易にします。テストではリファクタリングに自信を持っています。不適切に書かれたテストは、セメントをあなたのコードに注ぐようなものです。

は、次のことを考えてみましょう:

[TestFixture] 
public class ImageGalleryFixture : ContainerWiredFixture 
{ 
    [Test] 
    public void Should_save_image() 
    { 
     container.ConfigureMockFor<IFileRepository>() 
      .Setup(r => r.Create(It.IsAny<IFile>())) 
      .Verifiable(); 

     AddToGallery(new RequestWithRealFile()); 

     container.VerifyMockFor<IFileRepository>(); 
    } 

    private void AddToGallery(AddBusinessImage request) 
    { 
     container.Resolve<BusinessPublisher>().Consume(request); 
    } 
} 

ギャラリーに画像を追加する際に起こるいくつかのものがあります。画像のサイズが変更され、サムネイルが生成され、ファイルはAmazonS3に保存されます。コンテナを使用することで、テストする動作だけを簡単に分離することができます。この場合は永続的な部分です。

自動あざけるコンテナの拡張子この技術を使用する際に便利です:SimpleInjectorのような未登録/にUnknownサービスを解決する能力を持つコンテナを使用して http://www.agileatwork.com/auto-mocking-unity-container-extension/

+7

+1「like pouringあなたのコードにセメント "。私はいつもそれを使い始めました。 –

2

DryIocは(その鉱山)はまだ実装されていないインタフェースのためのモックを返すことができます。

これは、最初の単純な実装とその模倣された依存関係を使用して開発を開始し、進行状況に応じて実際のものと置き換えることができることを意味します。

関連する問題