2011-07-04 6 views
5

私は現在、IoCコンテナとしてAutofacを使用しているDIモデルに従っています。Mocking Frameworkを使用する理由

最近、MOQやRhino Mockのようなモックフレームワークを検討し始めました。しかし、それぞれのインタフェースに対してMock実装クラスを作成するだけでは、その使用法を正当化することはできません。

はなぜこのん:この代わりに

var mock = new Mock<IFoo>(); 
mock.Setup(foo => foo.DoSomething("ping")).Returns(true); 

class FooMock : IFoo { 
    bool DoSomething(string input) { 
    return input == "ping"; 
    } 
} 
mock = new FooMock(); 

後者はより冗長ですが、より柔軟で複雑なモックのために適切であるように思われます。

+0

いくつかの洞察力を提供するかもしれない同様の質問があります:http://stackoverflow.com/questions/300177/why-do-i-need-a-mocking-framework-for-my-unittests –

+0

@ Jason Downそれは同じような質問ではなく、同じ質問であると私は言うだろう。重複して投票すると投票しました。 –

+0

@Don Roby:ええ、まあまあ、まったく同じ質問ですね。 –

答えて

12

あなたの例で示したことは、実際の模擬よりも擬似/スタブのほうが多いことです。従属オブジェクトからあらかじめ缶詰めされた動作のみを望む場合は、嘲笑フレームワーク。

あり、実際Mocks aren't Stubsを議論Martin Fowler氏による標準的な記事があり、私はそれから次の段落引き上げました:

ここでの重要な違いは、我々は順序が右をしたことを確認し 方法ですが 倉庫とのやりとりにおけるもの。状態確認では、 は 倉庫の状態に対してアサートします。モックは の動作を使用して動作します。代わりに をチェックして、オーダーがウェアハウスで正しい コールを行ったかどうかを確認します。

本質的にmockでは、テスト中のメソッドが依存関係にどのように作用するかを確認しようとしています。モックには期待があり、メソッドが実行された後にそれらの期待を検証します。

もちろん、ケースモックで独自のケースを作成することもできますが、フレームワークを使用すると時間が大幅に短縮され、より読みやすいテストが行​​われ、テストのエラーを回避できます。

これは、あなたが複雑になってきたことを考えると、特に当てはまることですが、入力パラメータに応じてさまざまな値を使って特定の依存クラスをさまざまな回数呼び出すテスト方法を想像してみてください。あなた自身のために、しかし、良いmockingフレームワークを使用して自明です。あなたはおそらく、少なくともテストしたい

public void PrintForeignOrders(List<Orders> orders) 
{ 
    foreach(var order in orders) 
    { 
     if (order.IsForeign) 
     { 
      printer.PrintOrder(order.Number, order.Name); 
     } 
    } 
} 

::、いくつかのコードを実証し、このPrintOrders方法を(愚かな例を言い訳)想像する

  • リストが空何もないときにされ
  • 外国注文がある場合は、それが印刷されます
  • 2つの注文が両方とも印刷されている場合(正しい番号と名前で)

注入されたプリンタオブジェクトに対してこれらのテストを設定すると、良い模擬フレームワークで、ちょっとしたキーストロークになります。

7

しかし、私たちは私たちの インターフェースのそれぞれについて、モック 実装クラスを作成する上で その使用を正当化するように見えることはできません。

まさに模擬フレームワークが、あなたのクラスの振る舞いをテストできるようにスタブやモックの実装を作成することからあなたを救うものです。

あなたのしていることは間違っていません。あなたのプロジェクトで実行することができれば、是非ともそれに固執してください。これは多くの場合、非常に日常的な仕事のようです。 mockingフレームワークはあなたに多くの時間を節約することができますし、テストのためにコードベースを膨らませたり、モック実装にエラーが発生する可能性もありません。

9

インターフェイスを変更するたびに、新しいインターフェイスに準拠するために、モックオブジェクト(実際にはスタブ)をすべて手作業でコーディングする必要があります。

手でコード化されたスタブオブジェクトが多いと、インターフェイスを変更するたびにテストコードのメンテナンスが頻繁に行われます。ただし、モックフレームワークによって作成されたモックは、更新されたインターフェイスと常に互換性があります。

関連する問題