如果我只能定义一个变量,为什么要使用 It.is<> 或 It.IsAny<>?
Why use It.is<> or It.IsAny<> if I could just define a variable?
您好,当我看到这段代码时,我已经使用 moq 一段时间了。
我必须在我的一个仓库中设置一个 return。
mockIRole.Setup(r => r.GetSomething(It.IsAny<Guid>(), It.IsAny<Guid>(),
It.IsAny<Guid>())).Returns(ReturnSomething);
我有三个参数,我只是在网上的一篇文章或博客中看到的。
对象的It.Is<>
或It.IsAny<>
有什么用?如果我可以使用 Guid.NewGuid()
或其他类型,那为什么要使用 It.Is
?
抱歉,我不确定我的问题是否正确,或者我是否遗漏了一些测试知识。
不过好像都没什么问题。
如果你看 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");
使用 It.IsAny<>
、It.Is<>
或变量都有不同的用途。在设置或验证方法时,它们提供越来越具体的方法来匹配参数。
It.IsAny
使用 It.IsAny<>
设置的方法将匹配您提供给该方法的 任何 参数。因此,在您的示例中,以下调用都会 return 相同的事情 (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
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
会 return ReturnSomething
:当所有 Guid
都与您设置的预期值匹配时。
您好,当我看到这段代码时,我已经使用 moq 一段时间了。
我必须在我的一个仓库中设置一个 return。
mockIRole.Setup(r => r.GetSomething(It.IsAny<Guid>(), It.IsAny<Guid>(),
It.IsAny<Guid>())).Returns(ReturnSomething);
我有三个参数,我只是在网上的一篇文章或博客中看到的。
对象的It.Is<>
或It.IsAny<>
有什么用?如果我可以使用 Guid.NewGuid()
或其他类型,那为什么要使用 It.Is
?
抱歉,我不确定我的问题是否正确,或者我是否遗漏了一些测试知识。 不过好像都没什么问题。
如果你看 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");
使用 It.IsAny<>
、It.Is<>
或变量都有不同的用途。在设置或验证方法时,它们提供越来越具体的方法来匹配参数。
It.IsAny
使用 It.IsAny<>
设置的方法将匹配您提供给该方法的 任何 参数。因此,在您的示例中,以下调用都会 return 相同的事情 (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
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
会 return ReturnSomething
:当所有 Guid
都与您设置的预期值匹配时。