NSubstitute完全手册(六)使用函数设置返回值

简介:

对于一个属性或者方法调用的返回值,可以使用函数来返回结果。这允许我们在替代实例中嵌入更加复杂的逻辑。尽管通常来说这不是一个好的做法,但在某些情况下确实很有用。

复制代码
 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_ReturnFromFunction_ReturnSum()
 9     {
10       var calculator = Substitute.For<ICalculator>();
11 
12       calculator
13         .Add(Arg.Any<int>(), Arg.Any<int>())
14         .Returns(x => (int)x[0] + (int)x[1]);
15 
16       Assert.AreEqual(calculator.Add(1, 1), 2);
17       Assert.AreEqual(calculator.Add(20, 30), 50);
18       Assert.AreEqual(calculator.Add(-73, 9348), 9275);
19     }
复制代码

在这个示例中,我们使用参数匹配器来匹配所有对 Add() 方法的调用,使用一个 Lambda 函数来计算第一个和第二个参数的和,并将计算的结果传递给方法调用。

调用信息

为 Returns() 和 ReturnsForAnyArgs() 方法提供的函数是一个 Func<CallInfo, T> 类型,在这里,T是方法调用将要返回的值的类型,CallInfo 类型提供访问参数列表的能力。在前面的示例中,我们使用索引器 indexer 来访问参数列表。CallInfo 也提供了一个很简便的方法用于通过强类型方式来选择参数:

复制代码
 1     public interface IFoo
 2     {
 3       string Bar(int a, string b);
 4     }
 5 
 6     [TestMethod]
 7     public void Test_ReturnFromFunction_CallInfo()
 8     {
 9       var foo = Substitute.For<IFoo>();
10       foo.Bar(0, "").ReturnsForAnyArgs(x => "Hello " + x.Arg<string>());
11       Assert.AreEqual("Hello World", foo.Bar(1, "World"));
12     }
复制代码

在这里,x.Arg<string>() 将返回方法调用中的 string 类型的参数,而没有使用 (string)x[1] 方式。如果在方法调用中有两个 string 类型的参数,NSubstitute 将通过抛出异常的方式来告诉你无法确定具体是哪个参数。

回调

这种技术可用于在调用时访问一个回调函数:

复制代码
 1     [TestMethod]
 2     public void Test_ReturnFromFunction_GetCallbackWhenever()
 3     {
 4       var calculator = Substitute.For<ICalculator>();
 5 
 6       var counter = 0;
 7       calculator
 8         .Add(0, 0)
 9         .ReturnsForAnyArgs(x =>
10         {
11           counter++;
12           return 0;
13         });
14 
15       calculator.Add(7, 3);
16       calculator.Add(2, 2);
17       calculator.Add(11, -3);
18       Assert.AreEqual(counter, 3);
19     }
复制代码

或者也可以在 Returns() 之后通过 AndDoes() 来指定回调:

复制代码
 1     [TestMethod]
 2     public void Test_ReturnFromFunction_UseAndDoesAfterReturns()
 3     {
 4       var calculator = Substitute.For<ICalculator>();
 5 
 6       var counter = 0;
 7       calculator
 8         .Add(0, 0)
 9         .ReturnsForAnyArgs(x => 0)
10         .AndDoes(x => counter++);
11 
12       calculator.Add(7, 3);
13       calculator.Add(2, 2);
14       Assert.AreEqual(counter, 2);
15     }
复制代码

NSubstitute 完全手册








本文转自匠心十年博客园博客,原文链接:http://www.cnblogs.com/gaochundong/archive/2013/05/21/nsubstitute_return_from_a_function.html,如需转载请自行联系原作者
目录
相关文章
|
程序员
学C的第九天(深入学习函数:库函数、自定义函数、函数的参数、函数调用、练习、补充知识点)-2
5.5:练习(部分上一期做过,换成函数做法): (1).写一个函数可以判断一个数是不是素数:
|
程序员 编译器 C语言
学C的第九天(深入学习函数:库函数、自定义函数、函数的参数、函数调用、练习、补充知识点)-1
1.函数是什么: 维基百科中对函数的定义:子程序 * 在计算机科学中,子程序(英语:
C/C++ 库函数查询工具MSDN
当我们学习C/C++ 总会用到库函数,而面对陌生的函数时,我们就要去查询它的作用,参数,头文件,返回值等等。但是我们在查询它们的用用法时可能会耗费时间和精力,所以我将为大家提供一个好用的查询软件MSDN(注:不需要联网使用)
C/C++ 库函数查询工具MSDN
从零开始学Pyqt5之【如何解决自定义槽函数需要参数而信号没有参数传递的问题?(2种方式)】
从零开始学Pyqt5之【如何解决自定义槽函数需要参数而信号没有参数传递的问题?(2种方式)】
|
JavaScript
matlab函数文件,调用时等号左边调用返回值,为什么会报错?
matlab函数,svmlib的回归参数寻优,返回值出错,参数都已经放进去了,不知道什么原因,求大神帮忙看看。
c 高级函数的简单用法
c 中内置了很多高级的函数,我们先使用排序函数看一下 1 #include 2 #include 3 #include 4 5 int compare_score(const void *n1 ,const void *n2) { 6 7 int *a =...
892 0