簡體   English   中英

單元模擬測試中的 it.isAny 和 it.is 是什么

[英]What is it.isAny and what is it.is in Unit mock testing

已經有很多關於此的問題,但我認為我需要一些更基本的東西來清除這個概念,因為我是 TDD 的初學者。 到那時我不能前進。

您能否通過以下測試方法並解釋我是否有錯誤的理解:

[Test]
public void ShouldSearch()
{
         var ColumnList = new List<Column>();

下面這行表示我在嘲笑對象。

但是這里It.IsAny<>()是什么意思?

 this.ColumnServiceMock.Setup(x => x.GetColumn(It.IsAny<Context>(), It.IsAny<Column>()))
                       .Returns(ColumnList);

 var result = this.getColouminfo.GetFinalRecords(this.context, this.gridColumn);

 this.ColumnServiceMock.Verify(x => x.GetColumn(It.Is<Context>(y => y == this.context),
 It.Is<Column>(y => y.Id == 2)), Times.Once);

  Assert.AreEqual(1, result.Data.Count, "Not equal");

  Assert.IsTrue(result.Data.Success, "No success");

It.IsAny<T>正在檢查參數是否為 T 類型,它可以是 T 類型的任何實例。基本上是說,我不在乎你在這里傳入什么,只要它是 T 類型。

this.ColumnServiceMock.Setup(x => x.GetColumn(It.IsAny<Context>(), It.IsAny<Column>())).Returns(ColumnList);

上面是說,無論何時使用任何參數調用GetColumn方法(只要它們分別是ContextColumn類型),都返回ColumnList

It.Is<T>允許您檢查傳入的內容並確定傳入的參數是否滿足您的需求。

this.ColumnServiceMock.Verify(x => x.GetColumn(It.Is<Context>(y => y == this.context), It.Is<Column>(y => y.Id == 2)), Times.Once);

上面斷言GetColumn方法被調用了一次, Context參數等於this.ContextColumn參數的 Id 屬性等於 2。

編輯:幾年后用更多的知識重新審視這個答案。 this.ColumnServiceMock.Verify(x => x.GetColumn(It.Is<Context>(y => y == this.context), It.Is<Column>(y => y.Id == 2)), Times.Once); 可以縮短為this.ColumnServiceMock.Verify(x => x.GetColumn(this.context, It.Is<Column>(y => y.Id == 2)), Times.Once); . 您不需要使用 It.Is 來檢查引用相等性,您可以直接傳遞對象。

It.IsAny<T>()指定該類型的任何內容。

It.Is<T>()更具體,需要一個 lamda 來確保它完全匹配。

兩者都只是指定參數的方法,您不想在模擬時准確指定。 因此,例如,如果參數是字符串名稱並且您不關心測試中的確切名稱,則可以使用:

It.IsAny<string>()在您的模擬規范中,它將匹配任何字符串。

如果您總是希望名稱以“S”開頭,那么您可以這樣做

It.Is<string>(x => x.StartsWith("S"))只會匹配以 S 開頭的字符串。

暫無
暫無

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

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