You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:24:30