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,如需转载请自行联系原作者
目录
相关文章
|
7月前
|
物联网 程序员 API
程序员必知:WndPric的使用方法
程序员必知:WndPric的使用方法
34 0
|
8月前
|
PHP 开发者
【PHP开发专栏】PHP函数定义与调用技巧
【4月更文挑战第29天】本文深入探讨了PHP函数的使用技巧,涵盖函数定义、参数传递、调用方式及高级技巧。PHP函数通过`function`关键字定义,支持默认参数值和可变参数。参数传递分为值传递(默认)和引用传递。函数调用包括普通调用、静态方法调用和匿名函数。高级技巧包括函数回调、模拟函数重载和递归调用。理解并熟练应用这些技巧能提升PHP开发效率和代码质量。
77 0
|
算法 C语言
【C语言函数】入门教程
【C语言函数】入门教程
86 0
|
程序员
学C的第九天(深入学习函数:库函数、自定义函数、函数的参数、函数调用、练习、补充知识点)-2
5.5:练习(部分上一期做过,换成函数做法): (1).写一个函数可以判断一个数是不是素数:
|
程序员 编译器 C语言
学C的第九天(深入学习函数:库函数、自定义函数、函数的参数、函数调用、练习、补充知识点)-1
1.函数是什么: 维基百科中对函数的定义:子程序 * 在计算机科学中,子程序(英语:
Verilog语法入门(十二)参数传递
Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发。两种HDL均为IEEE标准。
330 0
WebApi入门第十一章(定时器作用及语法)
WebApi入门第十一章(定时器作用及语法)
298 0
WebApi入门第十一章(定时器作用及语法)
|
PHP C#
C#(十四)之函数(方法)
本篇内容记录了函数、函数的参数、参数匹配、递归函数。
159 0
C#(十四)之函数(方法)

热门文章

最新文章