2009-11-08 16 views
5

最近、IoCに着手しようとしています。しかし、私は1つのハードルに走り続けています。つまり、モックオブジェクトを使うのが大好きです。単体テスト、モックオブジェクト、iocのベストプラクティス

セットアップが迅速かつ簡単です。

しかし、私は自分のコードのどこにでもIoCを使用すると、モックオブジェクト(moqを使用)ではなくオブジェクトのテスト実装(および設定)を作成する必要があります。

結局のところ、私はテストのために膨大な構成ファイルを使います。

さらに、テストでは、テストからテストまでさまざまな動作が必要な場合があります。 moqオブジェクトでは、これは非常に簡単です。あなたはIoCと似たようなことをどうしますか?

ご協力いただければ幸いです。

おかげで、
マイク

+0

問題の詳細について教えてください。どのように、なぜあなたが問題を抱えているのか分かりません。たぶんコードサンプルですか? –

+0

インジェクションを使用している場合は、通常、クラスの依存関係をコンストラクタまたはプロパティに注入する必要があります。テストでは、モックによって注入されたものを置き換えるために必要なすべての継ぎ目が必要です。あなたは苦労している特定の事例を詳しく説明できますか? – Mathias

+0

なぜ単体テストにIOCコンテナを使用していますか? – mwjackson

答えて

5

IoCのは難しく、より簡単ではないモックオブジェクトを使用して行う必要があります。

いくつかのIoCコンテナフレームワークでは、既存のオブジェクトを挿入して注入することができます。 Moqとすれば、myMockObject.Objectを設定するだけです。

EDIT:モックとUnityを設定する例:代替として

var mockService = new Mock<IMyService>(); 
container.RegisterInstance<IMyService>(mockService.Object); 

、あなただけ(コンストラクタ注入のため)試験中のクラスのコンストラクタにモックオブジェクトを渡し、IoCコンテナをバイパスすることができ完全にあなたのユニットテストで。

編集:ジョシュの答えは、代替の良い例です。私は一般的に、コンテナを再構成するのではなく、彼の解決策を取ります。

+0

テストにIoCを使用する方法がわかりました。私たちは、WebコンテキストからWCSFで使用するために独自のIoCを使用する必要がありました。それは驚くほど簡単であり、Dependency InjectionとIoCのパターンを理解する上で優れた練習になりました。 – Josh

3

これら二つと競合がない

...私はのIoCを愛し、私は私にいくつかのモックオブジェクトが大好きです。あなたがどんな種類のDependency Injectionをしているのであれば、お気に入りの模擬フレームワークを使って模擬オブジェクトを作成してからSUTに渡すだけでいいはずです。

[Test] 
public void AnAwesomeTest() 
{ 
    IDependencyOne d1 = MyMocker.Create<IDependencyOne>(); 
    IDependencyTwo d2 = MyMocker.Create<IDependencyTwo>(); 

    //Constructor injection 
    SUT sut = new SUT(d1); 

    //Property Injection 
    sut.DependantProperty = d2; 

    //Do some stuff and Assert 
} 
+0

+1。 Moqを使って "新しいSUT(d1.Object)"になることに注意してください。 – TrueWill

+0

興味深い。私はRhinoMockに慣れています...もし構文がそれを許していなければ。 – Josh

+0

@ジョシュ:1つの違いは、d1とd2がMock タイプであることです。不利な点は、インターフェースに到達するためのObject .d1とd2の期待値を直接設定できることです。ライブラリを比較/対照する価値があります。彼らは異なる哲学を持っています。私はRhinoからMoqに切り替えました。 – TrueWill