博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NSubstitute完全手册(十二)使用回调函数和WhenDo语法
阅读量:7143 次
发布时间:2019-06-29

本文共 2143 字,大约阅读时间需要 7 分钟。

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

public interface ICalculator    {      int Add(int a, int b);      string Mode { get; set; }    }    [TestMethod]    public void Test_CallbacksWhenDo_PassFunctionsToReturns()    {      var calculator = Substitute.For
(); 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
();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() 方法的参数中包含的调用信息与中的相同,这些调用信息可以用于对参数进行访问。

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

[TestMethod]    public void Test_CallbacksWhenDo_UseWhenDoOnNonVoid()    {      var calculator = Substitute.For
(); var counter = 0; calculator.Add(1, 2).Returns(3); calculator .When(x => x.Add(Arg.Any
(), Arg.Any
())) .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,如需转载请自行联系原作者
你可能感兴趣的文章
java service wrapper日志参数设置及优化
查看>>
android build.prop详解
查看>>
Spring aop 切面编程
查看>>
C3P0连接池使用教程
查看>>
数据结构——红黑树
查看>>
高通平台MSM8916LCM模块移植(一)-bootloader部分【转】
查看>>
oracle表空间不足相关问题解决办法
查看>>
CentOS-7 在windows server 2012下的虚拟机安装教程
查看>>
函数调用过程栈帧变化详解
查看>>
Android项目实战(三十二):圆角对话框Dialog
查看>>
Word或Excel里画柱状图和折线图组合体
查看>>
[TypeScript] Create a fluent API using TypeScript classes
查看>>
秒杀多线程
查看>>
[原]win10下编译lua5.3.4
查看>>
spring List,Set,Map,Properties,array的配置文件注入方式
查看>>
Fireworks层与蒙版的概念和用法
查看>>
python os.listdir
查看>>
蓝桥杯历届试题题解1
查看>>
Linux C 创建目录函数mkdir相关【转】
查看>>
【js 正则表达式】记录所有在js中使用正则表达式的情况
查看>>