516

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

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

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

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

8 に答える 8

608

オプションを使用して、テスト後に検証を実行しTimes.Never()ます。

_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(), Times.Never());
于 2010-08-05T10:14:34.763 に答える
168

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

どちらか、あなたのモックを厳密にして、あなたが期待していないメソッドを呼び出した場合に失敗するようにします

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."));
于 2009-02-11T16:13:32.893 に答える
55

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

テストしたいことの 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);
}
于 2010-03-16T20:14:49.277 に答える
12

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

本当は、.AtMost(0)Returns ステートメントの後に指定した方がよいでしょう。

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

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

于 2009-02-19T09:34:48.807 に答える
-6

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

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

于 2009-02-11T15:59:01.510 に答える