2009-02-11 63 views
370

如何驗證該方法未在Moq中調用?如何驗證Moq中沒有調用該方法?

它有沒有像AssertWasNotCalled?

UPDATE:從3.0版開始,一種新的語法,可以用:

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

我想你應該在下面發表你的答案,而不是在你的實際問題中發佈它。否則它有點奇怪;) – ForceMagic 2013-06-04 21:29:59

回答

133

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.")); 
+6

...或Callback()設置一些可以被聲明的標誌。 – alex 2009-02-11 16:27:25

-4

使用.AtMostOnce();

真正的測試後,再次調用該方法。如果它拋出一個異常,它被調用。

+1

是不是有點太模糊,斷言異常是由嘲諷框架引發的? – alex 2009-02-11 16:02:16

+0

爲什麼?只需檢查例外的類型。如果是我的Moq,那麼你很安全。 – 2009-02-11 16:45:54

+6

使用與時間驗證.Never是一個更好的選擇......我同意亞歷克斯這個解決方案的工作原理,但絕對是模糊的。 – 2010-12-05 22:03:15

10

如提到這不會在Moq的的最新版本(因爲至少3.1),它應該在Verify方法中指定的工作答案。

實際上,最好在Returns語句後指定.AtMost(0)

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

雖然 「拋出」 也適用,AtMost(0)更有表現恕我直言。

22

被盜來源: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()); 
} 
不會被調用
423

在測試後運行驗證,該驗證具有Times.Never枚舉集。例如

_mock.Object.DoSomething() 
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never()); 
相關問題