NSubstitute完全手册(十一)参数匹配器

简介:

参数匹配器可以用于设置返回值检查接收到的调用。它提供了一种指定一个调用或一组调用的方式,这样可以对所有匹配的调用设置一个返回值,或者检查是否接收到了匹配的调用。

忽略参数

通过使用 Arg.Any<T>() 可以忽略一个T类型的参数。

复制代码
 1     public interface ICalculator
 2     {
 3       int Add(int a, int b);
 4       string Mode { get; set; }
 5     }
 6 
 7     [TestMethod]
 8     public void Test_ArgumentMatchers_IgnoringArguments()
 9     {
10       var calculator = Substitute.For<ICalculator>();
11 
12       calculator.Add(Arg.Any<int>(), 5).Returns(7);
13 
14       Assert.AreEqual(7, calculator.Add(42, 5));
15       Assert.AreEqual(7, calculator.Add(123, 5));
16       Assert.AreNotEqual(7, calculator.Add(1, 7));
17     }
复制代码

在这个例子中,我们设定当任意数与 5 相加时,返回值 7。我们使用 Arg.Any<int>() 来告诉 NSubstitute 忽略第一个参数。

我们也可以通过这种方法来匹配任意的子类型。
复制代码
 1     public interface IFormatter
 2     {
 3       void Format(object o);
 4     }
 5 
 6     [TestMethod]
 7     public void Test_ArgumentMatchers_MatchSubTypes()
 8     {
 9       IFormatter formatter = Substitute.For<IFormatter>();
10 
11       formatter.Format(new object());
12       formatter.Format("some string");
13 
14       formatter.Received().Format(Arg.Any<object>());
15       formatter.Received().Format(Arg.Any<string>());
16       formatter.DidNotReceive().Format(Arg.Any<int>());
17     }
复制代码

参数条件匹配

通过使用 Arg.Is<T>(Predicate<T> condition) 来对一个T类型的参数进行条件匹配。
复制代码
 1     [TestMethod]
 2     public void Test_ArgumentMatchers_ConditionallyMatching()
 3     {
 4       var calculator = Substitute.For<ICalculator>();
 5 
 6       calculator.Add(1, -10);
 7 
 8       // 检查接收到第一个参数为1,第二个参数小于0的调用
 9       calculator.Received().Add(1, Arg.Is<int>(x => x < 0));
10       // 检查接收到第一个参数为1,第二个参数为 -2、-5和-10中的某个数的调用
11       calculator
12         .Received()
13         .Add(1, Arg.Is<int>(x => new[] { -2, -5, -10 }.Contains(x)));
14       // 检查未接收到第一个参数大于10,第二个参数为-10的调用
15       calculator.DidNotReceive().Add(Arg.Is<int>(x => x > 10), -10);
16     }
复制代码

如果某参数的条件表达式抛出异常,则将假设该参数未被匹配,异常本身会被隐藏。

复制代码
 1     [TestMethod]
 2     public void Test_ArgumentMatchers_ConditionallyMatchingThrowException()
 3     {
 4       IFormatter formatter = Substitute.For<IFormatter>();
 5 
 6       formatter.Format(Arg.Is<string>(x => x.Length <= 10)).Returns("matched");
 7 
 8       Assert.AreEqual("matched", formatter.Format("short"));
 9       Assert.AreNotEqual("matched", formatter.Format("not matched, too long"));
10 
11       // 此处将不会匹配,因为在尝试访问 null 的 Length 属性时会抛出异常,
12       // 而 NSubstitute 会假设其为不匹配并隐藏掉异常。
13       Assert.AreNotEqual("matched", formatter.Format(null));
14     }
复制代码

匹配指定的参数 

使用 Arg.Is<T>(T value) 可以匹配指定的T类型参数。
复制代码
 1     [TestMethod]
 2     public void Test_ArgumentMatchers_MatchingSpecificArgument()
 3     {
 4       var calculator = Substitute.For<ICalculator>();
 5 
 6       calculator.Add(0, 42);
 7 
 8       // 这里可能不工作,NSubstitute 在这种情况下无法确定在哪个参数上应用匹配器
 9       //calculator.Received().Add(0, Arg.Any<int>());
10 
11       calculator.Received().Add(Arg.Is(0), Arg.Any<int>());
12     }
复制代码

通常来讲,这个匹配器不是必须的;大部分情况下,我们可以使用 0 来代替 Arg.Is(0)。然而在某些情况下,NSubstitute 无法解析出那个匹配器应用到了那个参数上(实际上,参数匹配器进行的是模糊匹配;而不是直接解析函数的调用)。在这些情况下会抛出一个 AmbiguousArgumentsException,并且会要求你指定一个或多个额外的参数匹配器。大多数情况下你可能不得不为每个参数显式的使用参数匹配器。

NSubstitute 完全手册






本文转自匠心十年博客园博客,原文链接:http://www.cnblogs.com/gaochundong/archive/2013/05/22/nsubstitute_argument_matchers.html,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
存储 大数据 Python
案例学Python:filter()函数的用法,高级!
`filter()`函数是Python中处理序列数据的强大工具,它允许我们高效地根据条件过滤元素。通过结合匿名函数、常规函数或直接利用Python的内置逻辑,`filter()`提供了灵活且高效的过滤机制,尤其在大数据处理和内存敏感的应用中展现出其价值。掌握 `filter()`的使用,不仅能提升代码的可读性和效率,还能更好地适应Python的函数式编程风格。
33 2
编程小白的自学笔记四(正则表达式模块search函数)
编程小白的自学笔记四(正则表达式模块search函数)
正则中re高级用法findall中的一个小坑
正则中re高级用法findall中的一个小坑
|
JavaScript 算法 前端开发
ES6知识点补充——模板字符串、默认参数
JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来了解模板字符串、默认参数
203 0
|
JavaScript 网络架构
ES6知识点补充——剩余参数、展开语法
JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来了解剩余参数、展开语法
189 0
|
PHP C#
C#(十四)之函数(方法)
本篇内容记录了函数、函数的参数、参数匹配、递归函数。
150 0
C#(十四)之函数(方法)
|
JavaScript
细读 ES6 | 模板字符串进阶用法
细读 ES6 | 模板字符串进阶用法
394 0
下一篇
无影云桌面