簡體   English   中英

如果我可以定義一個變量,為什么要使用 It.is<> 或 It.IsAny<>?

[英]Why use It.is<> or It.IsAny<> if I could just define a variable?

嗨,當我看到這段代碼時,我已經使用 moq 一段時間了。

我必須在我的一個回購中設置回報。

 mockIRole.Setup(r => r.GetSomething(It.IsAny<Guid>(), It.IsAny<Guid>(), 
                  It.IsAny<Guid>())).Returns(ReturnSomething);

我有三個參數,我剛剛在網上的一篇文章或博客中看到了這些參數。

It.Is<>It.IsAny<>對對象有什么用? 如果我可以使用Guid.NewGuid()或其他類型,那么為什么要使用It.Is

很抱歉,我不確定我的問題是否正確,或者我是否缺少一些測試知識。 但似乎這兩種方式都沒有錯。

使用It.IsAny<>It.Is<>或變量都有不同的用途。 在設置或驗證方法時,它們提供了越來越具體的方法來匹配參數。

它是任何

使用It.IsAny<>設置的方法將匹配您提供給該方法的任何參數。 因此,在您的示例中,以下調用都將返回相同的內容( ReturnSomething ):

role.GetSomething(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid());

Guid sameGuid = Guid.NewGuid();
role.GetSomething(sameGuid, sameGuid, sameGuid);

role.GetSomething(Guid.Empty, Guid.NewGuid(), sameGuid);

傳遞的Guid的實際值無關緊要。

這是

It.Is<>構造對於方法的設置或驗證很有用,讓您可以指定與參數匹配的函數。 例如:

Guid expectedGuid = ...
mockIRole.Setup(r => r.GetSomething(
                 It.Is<Guid>(g => g.ToString().StartsWith("4")), 
                 It.Is<Guid>(g => g != Guid.Empty), 
                 It.Is<Guid>(g => g == expectedGuid)))
         .Returns(ReturnSomething);

這允許您限制該值而不僅僅是任何值,但允許您對接受的內容保持寬容。

定義變量

當您使用變量設置(或驗證)方法參數時,您是在說您想要的正是該值。 使用另一個值調用的方法永遠不會匹配您的設置/驗證。

Guid expectedGuids = new [] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };
mockIRole.Setup(r => r.GetSomething(expectedGuids[0], expectedGuids[1], expectedGuids[2]))
         .Returns(ReturnSomething);

現在只有一種情況GetSomething將返回ReturnSomething :當所有Guid與您設置的預期值匹配時。

如果您查看Moq快速入門文檔

匹配參數

// any value
mock.Setup(foo => foo.DoSomething(It.IsAny<string>())).Returns(true);


// matching Func<int>, lazy evaluated
mock.Setup(foo => foo.Add(It.Is<int>(i => i % 2 == 0))).Returns(true); 


// matching ranges
mock.Setup(foo => foo.Add(It.IsInRange<int>(0, 10, Range.Inclusive))).Returns(true); 


// matching regex
mock.Setup(x => x.DoSomething(It.IsRegex("[a-d]+", RegexOptions.IgnoreCase))).Returns("foo");

暫無
暫無

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

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