当我看到这段代码时,我一直在使用moq。
我必须在我的一个回购邮件中设置一个回报。
mockIRole.Setup(r => r.GetSomething(It.IsAny<Guid>(), It.IsAny<Guid>(),
It.IsAny<Guid>())).Returns(ReturnSomething);
我有三个参数,我只是在网上的文章或博客中看到过这些参数。
It.Is&lt;&gt;有什么用?或It.IsAny&lt;&gt;对象?如果我可以使用Guid.NewGuid()或其他类型,那么为什么要使用It.Is?
对不起,我不确定我的问题是否正确,或者我是否缺少一些测试知识。 但似乎两种方式都没有错。
答案 0 :(得分:49)
使用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);
这允许您限制值多于任何值,但允许您对接受的内容保持宽松。
当您使用变量设置(或验证)方法参数时,您表示您希望完全该值。使用其他值调用的方法永远不会与您的setup / verify匹配。
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
匹配您设置的预期值时。
答案 1 :(得分:5)
如果你看Quickstart documentation for 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");