NSubstitute:如何访问返回

时间:2017-06-30 11:19:52

标签: c# unit-testing mocking nsubstitute

我想访问NSubstitute Returns方法中的实际参数。例如:

var myThing = Substitute.For<IMyThing>()
myThing.MyMethod(Arg.Any<int>).Returns(<actual parameter value> + 1)

使用NSubstitute我应该代替 <actual parameter value> 编写什么,或者我如何实现等效行为?

1 个答案:

答案 0 :(得分:11)

根据Call information documentation

  

可以将对属性或方法的调用的返回值设置为   功能的结果。

var myThing = Substitute.For<IMyThing>()
myThing
    .MyMethod(Arg.Any<int>())
    .Returns(args => ((int)args[0]) + 1); //<-- Note access to pass arguments

lambda函数的参数将允许访问在指定的从零开始的位置传递给此调用的参数。

对于强类型的args,也可以进行以下操作。

var myThing = Substitute.For<IMyThing>()
myThing
    .MyMethod(Arg.Any<int>())
    .Returns(args => args.ArgAt<int>(0) + 1); //<-- Note access to pass arguments
  

T ArgAt<T>(int position):获取在指定的从零开始的位置传递给此调用的参数,转换为类型T

因为在这种情况下,只有一个参数可以进一步简化为

var myThing = Substitute.For<IMyThing>()
myThing
    .MyMethod(Arg.Any<int>())
    .Returns(args => args.Arg<int>() + 1); //<-- Note access to pass arguments

此处args.Arg<int>()将返回传递给调用的int参数,而不必使用(int)args[0]。如果有多个,则使用索引。