【问题标题】:NSubstitute: How to access actual parameters in ReturnsNSubstitute:如何访问 Returns 中的实际参数
【发布时间】:2017-06-30 11:19:52
【问题描述】:
我想访问 NSubstitute Returns 方法中的实际参数。例如:
var myThing = Substitute.For<IMyThing>()
myThing.MyMethod(Arg.Any<int>).Returns(<actual parameter value> + 1)
使用 NSubstitute 我应该写什么来代替 <actual parameter value>,或者我怎样才能实现等效的行为?
【问题讨论】:
标签:
c#
unit-testing
mocking
nsubstitute
【解决方案1】:
根据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]。如果有多个,则将使用索引。