如何使用NSubstitute模拟带ref参数的void方法?
如何使用NSubstitute模拟带ref参数的void方法?
嘿,刚接触C#和NSubstitute的时候,碰到带ref参数的void方法确实容易卡壳!我来给你捋清楚怎么搞定这个问题,全用实际代码例子给你讲明白。
首先,我们先定一个场景:假设我们有个数据处理的接口,里面有个带ref参数的void方法,就像这样:
public interface IDataProcessor { // 带ref参数的void方法,用来处理数据并更新状态码 void ProcessData(ref int statusCode); }
接下来我们分两步来模拟这个方法:
1. 模拟方法调用时修改ref参数的值
有时候我们希望调用这个模拟方法后,传入的ref参数能被改成我们预期的值(比如操作成功的状态码200)。你可以这样写:
// 第一步:创建接口的模拟实例 var mockProcessor = Substitute.For<IDataProcessor>(); // 第二步:定义调用方法时要执行的动作——修改ref参数 int targetStatus = 200; mockProcessor.When(proc => proc.ProcessData(ref Arg.Any<int>())) .Do(context => { // 从调用上下文里获取第一个参数的引用(也就是ref的statusCode) ref int statusRef = ref context.ArgAt<int>(0); // 把它改成我们想要的值 statusRef = targetStatus; });
现在你可以测试这个效果:
// 初始化一个状态码为0 int testStatus = 0; // 调用模拟方法 mockProcessor.ProcessData(ref testStatus); // 此时testStatus已经被改成200了 Assert.AreEqual(200, testStatus);
2. 验证方法是否被指定的ref参数调用过
如果你需要确认这个模拟方法是不是被传入特定值的ref参数调用过,比如验证它是否被初始值为0的statusCode调用过,可以这样做:
int initialStatus = 0; // 先调用一次方法 mockProcessor.ProcessData(ref initialStatus); // 验证方法确实被传入0的ref参数调用过 mockProcessor.Received().ProcessData(ref Arg.Is(0));
这里要注意,NSubstitute处理ref参数的匹配时,Arg.Is()或者Arg.Any()都能用来匹配输入的ref参数值,只要和调用时传入的初始值对应上就行。
备注:内容来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

