[英]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
方法(只要它們分別是Context
和Column
類型),都返回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.Context
, Column
參數的 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.