質問

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

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

  • 一部の" business"を適用しますロジック
  • 必要に応じて、作成したプロバイダーを介して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();
役に立ちましたか?

解決

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

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

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

...  test here ...

mockDb.Verify();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top