簡體   English   中英

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

[英]How to verify that method was NOT called in Moq?

如何驗證未在Moq<\/a>中調用該方法?

它有類似 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>

這個答案是一種間接的方法。 不是檢查一個特定的方法沒有被調用,而是檢查一般情況下沒有發生意外的調用。

考慮到對模擬的徹底測試做了兩件事:

  1. 驗證是否進行了所有預期的調用<\/li>
  2. 確認沒有進行意外調用<\/li><\/ol>

    如果您已經在執行第 1 步,則添加第 2 步很簡單:

    筆記

使用 .AtMostOnce();

真正測試后,再次調用該方法。 如果它拋出異常,則調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM