MoqのVerifiable()の目的は何ですか?


125

の目的はVerifiable()何ですか?

私がaを確認し、これを省略Mockしても、それでもを確認しSetUpます。

編集:私はVerifyAll()すべてが検証されている理由を使用していました。に変更後Verify()、私.Verifiable() SetUpのs のみがチェックされていました。

回答:


83

補遺:他の回答が述べているように、の目的は.VerifiableSetupVerify(...)介してトリガーできる一連の「据え置き呼び出し」にa を参加させることmock.Verify()です。

OPの明確化により、これが目標であり、唯一の問題はそれが機能しなかった理由を解明することでしたが、@ Liamが主張したように、答えもこれに本当に触れるべきです:-私ができる限りの主要なユースケース参照してください:

  • mock.Setup()との間の乾燥度の維持mock.Verify
  • 実際のVerify呼び出し自体から検証の構成を切断できるようにする(たとえば、別のヘルパーメソッドで設定することができます)

...そして私の回答に要約すると、「上記のプロは一般に、これらの目標を達成することは、そのような構成に頼りすぎるテストの読みやすさと保守性に与える影響よりも重要であると考えられているので注意してください」

オリジナル:可能であれば、代わりにAAAレイアウトに従う必要があるため、作業が完了した後に、可能な限りorまたは(クレジット:@kzuとペアにするのではなく、明示的なmock.Verify( expression )呼び出しを行うmock.Setup( ... ).Verifiable()mock.Verify()mock.VerifyAll()必要があります。


7
@EricSmith振り返ってみると、私はそれを十分に強く置くとは思わない。作業をAAAバンドルに分割することには、アレンジフェーズとアサートフェーズの共通性に過度に集中するよりも、はるかに多くの利点があります。90%の確率で、最後にVerify呼び出しをどのように表現するかという微妙な違いから得られることがあるので、そのために最適化するには多くの時間を費やす必要があります。manning.com/osheroveが非常に優れている点の1つは、誰かが飛び込んできたときにテストを理解できるようにすることが重要であることです。
Ruben Bartelink

3
私は通常、受け入れられている知恵の粒度に反対する人ではありませんが、すべての場合において、AAAの利点とVerifyable()/の利点をまだ確信していませんVerifyAll()。私の現在の単体テストには、多数のSetup(...)呼び出し(> 30)があります。規約を満たすために、それぞれを同等のVerify()と一致させることができますが、これにより大量のコードの重複が発生し、単体テストの数が増えるにつれて維持および読み取りが難しくなります。私が本当に求めているのは、セットアップが多数ある場合に例外を作成できるか、または厳格Verifiable()で高速なルールを回避することですか?
スティーブチェンバーズ

5
@SteveChambers AAAの重要な要素は、A *ではないことです。1つのActと1つのAssertが存在する必要があります。したがって、技術的にはコードの方が少ないと言って間違いはありませんが、どの(sub)Actsと(sub)Assertsにどのセットアップが適用されるかが偶然一致すると、必ず地雷原になります。だから、難しくも速くもありませんが、50:50に近いことを示唆するのは非常に悪いアドバイスです。(また、行為中に特定の動作を導入しようとしている場合を除き、検証を行うために設定を行う必要がないことに注意してください。これは明確なテストのもう1つの要素です)
Ruben Bartelink

1
@Liamそしてそれはある完全に罰金あなたはまだそれがあなたの仕事のための適切なツールです確信していることを確かに-それはきちんと乾燥を実現しているという事実にもかかわらず、すなわち-私の本当のポイントは、それはモックでテストを書くには一般的なアプローチとして、ひんしゅくを買うちょうどということですa Setupとaの間Verifyでは、AAAおよび強く
示唆する

1
@Liamプロディングをありがとう; あなたがしている点であなたが正しいので、私は私の答えを更新しました。私がこのようにSOの質問に答えた当時、私の見解は、一般的には、原子的な答えを簡潔に述べてから、他の答えのような競合する答えに地図を記入させることでした。最近(まだ質問に答えるのに時間をかけた場合)、私はおそらくこれが最初のインスタンスになったというより完全な答えを出そうとするでしょう。
Ruben Bartelink 2015年

54

Verify()テストの最後にメソッドが呼び出されたときに、検証可能とマークされた期待値のいずれかが呼び出されていない場合、例外はthrownです。

VerifyAll() 検証可能な期待についてはチェックしません。


VerifyAll()が検証可能な期待をチェックしないことについてもう少し説明してもらえますか?
JW

@JW VerifyAllは、検証可能な期待としてマークされているかどうかを考慮せずに、すべてのセットアップを検証することを意味します。
phoog
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.