2009-07-29 9 views
24

私のチームは最近、非常に柔軟で読みやすい構文のために、Moockをモックフレームワークとして使用することを決定しました。私たちが新しいので、私は簡単な質問であるように見えます。検索(ここではGoogleなど)はMoqの他のニュアンスについて議論していますが、いくつかの一見関連した質問は赤い稚魚に変わった。Moqで "ショートサーキット"ボイドメソッド?

私たちは、外部依存関係(正確にはAmazon SimpleDb)を持つクラスをテストしていますが、私たちのテストではライブ接続ができないようにします。特定の方法:

  • が適切であれば、私はユニットにしたいのは、​​

それを呼びましょう、我々が構築したプロバイダを経由してSDBへの呼び出しを呼び出す

  • いくつかの「ビジネス」ロジックを適用しますこれをテストして、必要なコンテキストを設定し、​​が呼び出されたことを保証しますが、​​は実際には呼び出されません(A)ため、SDBのプロバイダは完全に水和されておらず、B )私はその取引を何百、何千回も支払う必要はありません)。

    値を返すメソッドを扱うときは、これは些細なことでした。私も上記の概説場合

    mockDb.Setup(d => d.GiveMeSomething()).Returns("Foo"); 
    

    、私の「​​」方法は無効であり、したがって、部品番号のReturns()メソッドを使用するオプションは使用できません。私は​​が呼び出されたことを確認するコールバックをセットアップすることができますが、実際に何もしないようにすることはできません。

    有望/ナイーブ、私は次のように働くだろうと思ったが、まだメソッドを呼び出すように表示されます。

    mockDb.Setup(d => d.SaveItem(It.IsAny<object>())); 
    

    だから、数百万ドルの質問:次の架空のコードの部品番号は何ですか?

    mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).STOP_RIGHT_HERE(); 
    
  • +0

    編集状況を明確にするために、テストが漂っ「ビジネス」クラスのためではなく、実際のSimpleDBの実装のためです。 SimpleDBの実装は他の場所でテストされています。ここでは私が嘲笑しているものです。 – bakasan

    答えて

    29

    ​​方法は、仮想的または抽象的で、あなたはこの方法はモックで何もしないように再実装する必要があり、Callbase = trueを設定していない場合。

    あなたが行うことができるはず:

    mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).Verifiable(); 
    
    ... test here ... 
    
    mockDb.Verify(); 
    
    +0

    パーフェクト!確かにVerifiable()/ Verify()の意図であり、より正式なドキュメントを持っていても、その領域のスレッドや投稿を読み上げることさえ知りませんでした。 ちょうどそれに渦を与え、私はこのシナリオに対して正と負の両方のテストケースを得ました。どうもありがとう! – bakasan

    +2

    +1;さらに、mockDb.VerifyAll()を呼び出すことによって、Verifiable()フラグに関係なくすべての呼び出しを検証することもできます。 –

    +0

    この回答は他のシナリオ、つまりメソッドも仮想でも抽象的でもないため拡張できますか? – leon