34

私のチームは最近、Moqをモックフレームワークとして使用することを決定しました。これは、その驚異的な柔軟性と非常に読みやすい構文のためです。私たちはそれに慣れていないので、単純な質問のように見えるものに遭遇しています-検索(ここでは、Googleなど)は、Moqの他のニュアンスに関する多くの議論を見つけますが、必ずしも私が求めているものではありません、そして一見関連しているように見えるいくつかの質問は、赤いニシンに変わりました。

外部依存関係(正確にはAmazon SimpleDb)を持つクラスをテストしていますが、テストをライブ接続にバインドしたくありません。特定の方法:

  • いくつかの「ビジネス」ロジックを適用します
  • 必要に応じて、構築したプロバイダーを介してSDBへの呼び出しを呼び出します。呼び出しましょうSaveItem()

必要なコンテキストを設定し、呼び出されたことを確認するようにこれを単体テストしたいのですが、実際には呼び出されないSaveItem()方法でSaveItem()(Aのため)、SDBのプロバイダーは完全に水和されておらず、爆撃される可能性が高いモックですB)そのトランザクションに何百、何千回も支払う必要はありません)。

値を返すメソッドを扱う場合、これは簡単なことでした。

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

ただし、上記で概説した場合、私の " SaveItem()"メソッドは無効であるため、MoqのReturns()メソッドを使用するオプションは使用できません。そして、SaveItem()呼び出されたことを確認するためのコールバックを設定することはできますが、実際には何もしないようにすることはできません。

ナイーブ/希望に満ちた、私は次のことがうまくいくと思いましたが、それでもメソッドを呼び出すようです:

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

それで、百万ドルの質問:次の架空のコードのMoqは何ですか?

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

1 に答える 1

38

SaveItem()メソッドが仮想または抽象であり、設定していない場合は、Callbase = trueモックで何もしないようにメソッドを再実装する必要があります。

次のことができるはずです。

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

...  test here ...

mockDb.Verify();
于 2009-07-29T22:59:31.323 に答える