web-dev-qa-db-ja.com

Moqでメソッドが呼び出されなかったことを確認する方法は?

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

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

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

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

UPDATE:バージョン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."));
145
Dan Fish

Times.Never enumセットを持つテストの後に検証を実行します。例えば.

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

盗まれた: 質問に対するジョンフォスターの回答、「Moqをよりよく理解するために助けが必要」

テストしたいことの1つは、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());
}
40
Chris Marisic

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

実際には、Returnsステートメントの後に.AtMost(0)を指定する方が適切です。

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

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

9
miha