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,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
SQL Oracle 数据库
这款免费数据库工具,可能是YashanDB图形化管理的最佳选择
DBeaver for YashanDB 是一款专为国产自研数据库 YashanDB 定制的图形化管理工具,基于全球流行的开源数据库工具 DBeaver 二次开发而成。它深度适配 YashanDB 的各种架构,支持 HEAP/LSC 多形态表管理和 Oracle 生态兼容,提供高效的对象管理、智能 SQL 开发和工业级 PL/SQL 调试功能。通过可视化操作,开发者可轻松完成物化视图配置、存储过程管理等复杂任务,大幅提升效率。该工具完全免费,支持多平台,为企业级数据库管理提供了成熟解决方案。
|
7月前
|
机器学习/深度学习 人工智能 JSON
Resume Matcher:增加面试机会!开源AI简历优化工具,一键解析简历和职位描述并优化
Resume Matcher 是一款开源AI简历优化工具,通过解析简历和职位描述,提取关键词并计算文本相似性,帮助求职者优化简历内容,提升通过自动化筛选系统(ATS)的概率,增加面试机会。
646 18
Resume Matcher:增加面试机会!开源AI简历优化工具,一键解析简历和职位描述并优化
|
4月前
|
传感器 机器人 开发者
ROS服务(Service)通信中的模型与实际应用: 初识Hello World并予以扩展
总而言之,ROS服务提供的是一种可靠而灵活的通信方式。每一次服务的请求和应答都会阻塞,直至应答完成。这意味着在调用服务之后,你可以确保你的请求被正确处理。这也是它在机器人系统中如此重要的原因,因为在许多情况下,我们需要获取实时、准确的结果,例如控制机器人执行精确的运动。
135 1
|
11月前
|
安全 Go 调度
Go语言中的并发编程:掌握goroutines和channels
在现代软件开发中,并发编程已经成为不可或缺的一部分。Go语言以其简洁的语法和强大的并发特性,成为了开发者的首选之一。本文将深入探讨Go语言中的两个核心概念——goroutines和channels,并通过实际代码示例展示如何使用它们来实现高效的并发处理。无论你是初学者还是有经验的开发者,通过本文的学习,你将能够更好地理解和应用Go语言的并发机制,提升你的编程技能。
|
安全 测试技术 Swift
Llama 3开源,魔搭社区手把手带你推理,部署,微调和评估
Meta发布了 Meta Llama 3系列,是LLama系列开源大型语言模型的下一代。在接下来的几个月,Meta预计将推出新功能、更长的上下文窗口、额外的模型大小和增强的性能,并会分享 Llama 3 研究论文。
Llama 3开源,魔搭社区手把手带你推理,部署,微调和评估
|
存储 文件存储 对象存储
FastDFS和Minio如何选择
【6月更文挑战第16天】FastDFS和Minio如何选择
2580 1
|
SQL 关系型数据库 MySQL
【MySQL-3】图形化界面工具DataGrip安装&配置&使用
【MySQL-3】图形化界面工具DataGrip安装&配置&使用
|
Docker 容器
docker pull出现错误或速度慢解决办法
在使用 Docker 时遇到拉取镜像速度慢的问题,可以使用国内的镜像源可以提高下载速度。
3833 0