如何驗證該方法未在Moq中調用?如何驗證Moq中沒有調用該方法?
它有沒有像AssertWasNotCalled?
UPDATE:從3.0版開始,一種新的語法,可以用:
mock.Verify(foo => foo.Execute("ping"), Times.Never());
如何驗證該方法未在Moq中調用?如何驗證Moq中沒有調用該方法?
它有沒有像AssertWasNotCalled?
UPDATE:從3.0版開始,一種新的語法,可以用:
mock.Verify(foo => foo.Execute("ping"), Times.Never());
UPDATE:從版本3開始,檢查上面問題的更新或Dann的答案。
要麼,讓你的模擬嚴格,因此,如果你要求,你沒有方法將失敗的預期
new Mock<IMoq>(MockBehavior.Strict)
或者,如果你希望你的模擬,以鬆,使用.Throws (例外)
var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));
...或Callback()設置一些可以被聲明的標誌。 – alex 2009-02-11 16:27:25
使用.AtMostOnce();
真正的測試後,再次調用該方法。如果它拋出一個異常,它被調用。
是不是有點太模糊,斷言異常是由嘲諷框架引發的? – alex 2009-02-11 16:02:16
爲什麼?只需檢查例外的類型。如果是我的Moq,那麼你很安全。 – 2009-02-11 16:45:54
使用與時間驗證.Never是一個更好的選擇......我同意亞歷克斯這個解決方案的工作原理,但絕對是模糊的。 – 2010-12-05 22:03:15
如提到這不會在Moq的的最新版本(因爲至少3.1),它應該在
Verify
方法中指定的工作答案。
實際上,最好在Returns語句後指定.AtMost(0)
。
var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);
雖然 「拋出」 也適用,AtMost(0)
更有表現恕我直言。
被盜來源:John Foster's answer to the question, "Need help to understand Moq better"
其中之一,你可能要測試的是事物的薪酬方法 時,65歲以上的人傳遞到 方法
不會被調用[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()); }
在測試後運行驗證,該驗證具有Times.Never
枚舉集。例如
_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());
我想你應該在下面發表你的答案,而不是在你的實際問題中發佈它。否則它有點奇怪;) – ForceMagic 2013-06-04 21:29:59