[英]How to verify that method was NOT called in Moq?
它有類似 AssertWasNotCalled 的東西嗎?
更新:從 3.0 版開始,可以使用新語法:
mock.Verify(foo => foo.Execute("ping"), Times.Never());
在具有Times.Never
枚舉集的測試之后運行驗證。 例如
_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(), Times.Never);
更新:從第 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."));
竊取自: 約翰·福斯特 (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); }
這在最新版本的 Moq (至少從 3.1 開始)中不起作用,應該在答案中提到的
Verify
方法中指定它。
實際上,最好在 Returns 語句之后指定.AtMost(0)
。
var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);
雖然“拋出”也有效,但AtMost(0)
更具表現力恕我直言。
假設你有這個方法並且你想測試它沒有被調用
//Setup
var databaseSessionMock = new Mock<IDatabaseSession>();
databaseSessionMock.Setup(m => m.Commit()).Returns(true).Verifiable();
RepositoryFactory.Configure<IDatabaseSession>(databaseSessionMock.Object);
你可以這樣測試
databaseSessionMock.Verify(m => m.Commit(It.IsAny()), Times.Never(), "Database Session mock object was not used");
我意識到這是一個非常古老的問題,但它剛剛出現在我的側邊欄中,我想添加我的解決方案。
作為設置的一部分,許多單元測試似乎模擬了幾個功能,但在測試期間並未使用。
當然最好啟用嚴格模擬(這意味着任何未明確設置的內容都會引發異常),然后不要設置任何您不希望調用的函數。 或者換一種說法,只設置一個測試期望調用的函數,其他任何東西都會拋出異常。
var thingBeingTested = new Mock<IThink>(MockBehaviour.Strict);
thingBeingTested.ThisWillThrowAnExceptionBecauseItHasNotBeenMocked();
使用VerifyNoOtherCalls<\/code> (需要 Moq 4.8 或更高版本)
<\/h2> 這個答案是一種間接的方法。 不是檢查一個特定的方法沒有被調用,而是檢查一般情況下沒有發生意外的調用。
考慮到對模擬的徹底測試做了兩件事:
- 驗證是否進行了所有預期的調用<\/li>
- 確認沒有進行意外調用<\/li><\/ol>
如果您已經在執行第 1 步,則添加第 2 步很簡單:
筆記
- 如果您省略第 1 步,第 2 步將簡單地確保根本沒有對模擬進行調用。<\/li>
- 這不需要嚴格的模擬。<\/li>
- 來源:起訂量快速入門<\/a><\/li><\/ul>"
使用 .AtMostOnce();
真正測試后,再次調用該方法。 如果它拋出異常,則調用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.