NSubstitute完全手册(十二)使用回调函数和WhenDo语法

简介:

有时当收到一个特殊的调用时能执行一些代码是非常有用的。我们在使用函数设置返回值一节已经看到了类似的代码。

复制代码
    public interface ICalculator
    {
      int Add(int a, int b);
      string Mode { get; set; }
    }

    [TestMethod]
    public void Test_CallbacksWhenDo_PassFunctionsToReturns()
    {
      var calculator = Substitute.For<ICalculator>();

      var counter = 0;
      calculator
        .Add(0, 0)
        .ReturnsForAnyArgs(x => 0)
        .AndDoes(x => counter++);

      calculator.Add(7, 3);
      calculator.Add(2, 2);
      calculator.Add(11, -3);
      Assert.AreEqual(counter, 3);
    }
复制代码

关于传递函数参数,在使用函数设置返回值这一节有更详细的介绍。

为无返回值调用创建回调

Returns() 可以被用于为成员设置产生返回值的回调函数,但是对于 void 类型的成员,我们需要不同的方式,因为我们无法调用一个 void 并返回一个值。对于这种情况,我们可以使用 When..Do 语法。

当被调用时,做这件事

When..Do 使用两个调用来配置回调。首先,调用替代实例的 When() 方法来传递一个函数。该函数的参数是替代实例自身,然后此处我们可以调用我们需要的成员,即使该成员返回 void。然后再调用 Do() 方法来传递一个回调,当替代实例的成员被调用时,执行这个回调。

复制代码
 1     public interface IFoo
 2     {
 3       void SayHello(string to);
 4     }
 5 
 6     [TestMethod]
 7     public void Test_CallbacksWhenDo_UseWhenDo()
 8     {
 9       var counter = 0;
10       var foo = Substitute.For<IFoo>();
11 
12       foo.When(x => x.SayHello("World"))
13         .Do(x => counter++);
14 
15       foo.SayHello("World");
16       foo.SayHello("World");
17       Assert.AreEqual(2, counter);
18     }
复制代码

传递给 Do() 方法的参数中包含的调用信息与传递给 Returns() 回调的参数中的相同,这些调用信息可以用于对参数进行访问。

注意,我们也可以对非 void 成员使用 When..Do 语法,但是,通常来说更加推荐 Returns() 语法,因为其更加简洁明确。你可能会发现,对于非 void 函数,当你想执行一个函数而不改变之前的返回值时,这个功能是非常有用的。

复制代码
    [TestMethod]
    public void Test_CallbacksWhenDo_UseWhenDoOnNonVoid()
    {
      var calculator = Substitute.For<ICalculator>();

      var counter = 0;
      calculator.Add(1, 2).Returns(3);
      calculator
        .When(x => x.Add(Arg.Any<int>(), Arg.Any<int>()))
        .Do(x => counter++);

      var result = calculator.Add(1, 2);
      Assert.AreEqual(3, result);
      Assert.AreEqual(1, counter);
    }
复制代码

为每个参数创建回调

如果在某些地方,我们仅需要对一个特殊的参数创建回调,则我们可能会使用为每个参数创建回调的方法,例如 Arg.Do() 和 Arg.Invoke(),而不是使用 When..Do。

参数回调给予我们更加简洁的代码,NSubstitute 中的其他 API 也保持这一风格。更多信息和示例,请查看在参数上执行操作一节。

NSubstitute 完全手册






本文转自匠心十年博客园博客,原文链接:http://www.cnblogs.com/gaochundong/archive/2013/05/22/nsubstitute_callbacks_void_calls_and_when_do.html,如需转载请自行联系原作者
目录
相关文章
|
9月前
|
存储 关系型数据库 数据库
数据的反规范化架构
【6月更文挑战第13天】 本文介绍数据库设计包括规范化和反规范化。优化设计和应用规范化规则确保高效且准确的数据存储。
250 2
数据的反规范化架构
|
人工智能
阿里 AI 阅读理解冠军背后,用了什么技术?
今天,阿里巴巴高级算法专家吴晨带你揭秘这项技术。
1043 0
|
5月前
|
BI Linux API
掌握 SkiaSharp 轻松实现 .NET 跨平台绘图
.NET 框架的发展,我们越来越多地寻求能够在多个平台上无缝运行的应用解决方案。
998 2
|
10月前
|
存储 算法 Linux
深入理解操作系统内存管理:原理与实践
【5月更文挑战第14天】 在现代计算机系统中,操作系统的内存管理是确保系统高效稳定运行的关键组成部分。本文将详细探讨操作系统内存管理的基本原理,包括虚拟内存的概念、物理内存与进程地址空间的映射机制、以及分页和分段技术的具体实现。此外,文章还将介绍内存分配策略、内存碎片问题及其解决方案,以及现代操作系统中采用的高级内存管理特性,如Linux内核的内存管理子系统。通过理论分析与实际案例相结合的方式,旨在帮助读者深入理解并掌握操作系统内存管理的核心知识。
|
10月前
|
算法 程序员 PHP
编写魅力十足的代码:优化可读性、维护性和性能的关键
本篇汇总了平时在工作开发中常遇到的业务逻辑的优雅写法,也汇总了自己还是新人时,拿到一个业务不知道怎么下手的痛点,依稀记得那时候总感觉自己写的代码不规范。 写完之后,感觉还是美好的,又学到东西了。
|
10月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的电子病历管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的电子病历管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
138 1
|
安全 Java 容器
Spring杂谈 | 什么是ObjectFactory?什么是ObjectProvider?
Spring杂谈 | 什么是ObjectFactory?什么是ObjectProvider?
349 0
Spring杂谈 | 什么是ObjectFactory?什么是ObjectProvider?
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
【AI大模型】Transformers大模型库(三):特殊标记(special tokens)
【AI大模型】Transformers大模型库(三):特殊标记(special tokens)
204 0