如果我可以定义变量,为什么要使用It.is <>或It.IsAny <>?

use*_*948 32 c# testing unit-testing moq mocking

嗨,当我看到这段代码时,我一直在使用moq.

我必须在我的一个回购中设置一个回报.

 mockIRole.Setup(r => r.GetSomething(It.IsAny<Guid>(), It.IsAny<Guid>(), 
                  It.IsAny<Guid>())).Returns(ReturnSomething);
Run Code Online (Sandbox Code Playgroud)

我有三个参数,我只是在网上的一篇文章或博客中看到过这些参数.

It.Is <>或It.IsAny <>对象的用途是什么?如果我可以使用Guid.NewGuid()或其他类型,那么为什么要使用It.Is?

对不起,我不确定我的问题是否正确,或者我是否缺少一些测试知识.但似乎两种方式都没有错.

Pat*_*irk 59

使用It.IsAny<>,It.Is<>或变量都可以用于不同的目的.在设置或验证方法时,它们提供了越来越具体的方法来匹配参数.

It.IsAny

方法设置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);
Run Code Online (Sandbox Code Playgroud)

通过的实际价值无关紧要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);
Run Code Online (Sandbox Code Playgroud)

这允许您限制值多于任何值,但允许您对您接受的内容宽容.

定义变量

当你安装(或确认)具有可变的方法参数,你说你想正是该值.使用其他值调用的方法永远不会与您的setup/verify匹配.

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

现在只有一种情况GetSomething会返回ReturnSomething:当所有Guids匹配你设置的预期值时.


Nko*_*osi 5

如果您查看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");
Run Code Online (Sandbox Code Playgroud)