如何使用NSubstitute捕获方法调用中的多个参数?
用NSubstitute捕获多参数方法的调用参数
如果你的方法包含多个参数,想要捕获调用时的参数,有两种常用方案:
方案1:捕获单次调用的单个参数值
针对每个参数单独使用Arg.Do<T>(),直接将参数值赋值给变量:
// 假设目标方法是 void SomeMethod(int num, string text, bool flag) int? receivedNum = null; string? receivedText = null; bool? receivedFlag = null; // 为每个参数绑定捕获逻辑 substitute.SomeMethod( Arg.Do<int>(num => receivedNum = num), Arg.Do<string>(text => receivedText = text), Arg.Do<bool>(flag => receivedFlag = flag) ); // 调用目标方法后,变量会被赋值为对应的参数值
方案2:捕获所有调用的参数组合(支持多次调用)
如果需要记录方法每次调用的完整参数集合,可以结合When()和Do(),通过CallInfo对象获取所有参数:
用元组存储参数(简洁方式)
var receivedCalls = new List<(int, string, bool)>(); substitute.When(x => x.SomeMethod(Arg.Any<int>(), Arg.Any<string>(), Arg.Any<bool>())) .Do(callInfo => receivedCalls.Add(( callInfo.Arg<int>(0), // 按索引获取第1个参数 callInfo.Arg<string>(1),// 按索引获取第2个参数 callInfo.Arg<bool>(2) // 按索引获取第3个参数 )) ); // 多次调用方法后,receivedCalls会保存每一次调用的参数组合
用自定义类存储参数(适合复杂参数场景)
如果参数数量多或者类型复杂,建议定义专门的类来封装参数:
// 定义参数封装类 public class SomeMethodArgs { public int Number { get; set; } public string Text { get; set; } = string.Empty; public bool Flag { get; set; } } var receivedCalls = new List<SomeMethodArgs>(); substitute.When(x => x.SomeMethod(Arg.Any<int>(), Arg.Any<string>(), Arg.Any<bool>())) .Do(callInfo => receivedCalls.Add(new SomeMethodArgs { Number = callInfo.Arg<int>(0), Text = callInfo.Arg<string>(1), Flag = callInfo.Arg<bool>(2) }) );
另一种获取参数的方式(通过参数数组)
你也可以通过CallInfo.Args()获取所有参数的数组,再强转成对应类型:
.Do(callInfo => { object[] args = callInfo.Args(); int num = (int)args[0]; string text = (string)args[1]; bool flag = (bool)args[2]; receivedCalls.Add((num, text, flag)); })
内容的提问来源于stack exchange,提问作者Filip Östermark
相关产品推荐
相关产品推荐

