Moqでメソッドが呼び出されなかったことを確認するにはどうすればよいですか?


466

Moqでメソッドが呼び出されなかったことを確認するにはどうすればよいですか?

AssertWasNotCalledのようなものはありますか?

更新:バージョン3.0以降、新しい構文を使用できます。

mock.Verify(foo => foo.Execute("ping"), Times.Never());

回答:


155

更新:バージョン3以降、上記の質問または下記のDannの回答の更新を確認してください。

どちらか、モックを厳格にして、期待していないメソッドを呼び出すと失敗するようにします

new Mock<IMoq>(MockBehavior.Strict)

または、モックを緩くしたい場合は、.Throws(Exception)を使用します

var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));

9
...またはCallback()を使用して、アサートできるフラグを設定します。
アレックス

2
また、option#2では、一般的なTeardownメソッドにVerifyAllを含めることはできません-期待に応えられなかったと言って失敗します。テストが理想的にパスする必要があるとき。
岐阜

51
これはメソッド内でキャッチされ、機能するため、実際には「検証されない」とは呼ばれません-誤検知を提供します!
Dan

4
Expectは非推奨になりました
Tomasz Sikora 2013

5
これは2009年には最善の方法だったかもしれませんが、確かに今はそうではありません。申し訳ありません
Fabio Milheiro、2015

537

Times.Never列挙型が設定されているテストの後に検証を実行します。例えば

_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());

4
ここで重要なのは、Verify(action、Never)呼び出しがモックの呼び出しの後にあることです。後でVerifyAll()を呼び出すための検証を設定していると思いました(機能しません
piers7

シンプルで効果的。ありがとう。
Ian Grainger

45

盗まれたもの:「Moqをよりよく理解するために助けが必要です」という質問に対するJohn Fosterの回答

65歳以上の人がメソッドに渡されたときにpayメソッドが呼び出されないことをテストする必要があるかもしれません。

[Test]
public void Someone_over_65_does_not_pay_a_pension_contribution() {

    var mockPensionService = new Mock<IPensionService>();

    var person = new Person("test", 66);

    var calc = new PensionCalculator(mockPensionService.Object);

    calc.PayPensionContribution(person);

    mockPensionService.Verify(ps => ps.Pay(It.IsAny<decimal>()), Times.Never());
}

10

これは、Moqの最近のバージョン(少なくとも3.1以降)では機能しませんVerify。回答で述べたように、メソッドで指定する必要があります。

実際には.AtMost(0)、Returnsステートメントの後に指定することをお勧めします。

var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);

「スロー」も機能しますが、AtMost(0)より表現力豊かな私見です。


-5

.AtMostOnce();を使用します。

実際のテストの後、メソッドを再度呼び出します。例外をスローする場合は、呼び出されました。


1
フレームワークをモックすることによって例外がスローされたと主張するには、少しあいまいではありませんか?
アレックス、

どうして?例外のタイプを確認してください。それが私のMoqをスローしたものであれば、あなたは安全です。
アーロンディグラ2009

8
TimesでVerifyを使用する。
ビープ音ビープ音
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.