如何在NSubstitute中使用被替代接口的传入参数(i,j)
解决NSubstitute中获取接口方法参数的问题
你在使用NSubstitute模拟IGamePieceFactory时,无参的Create()方法运行正常,但带int i, int j参数的Create(int i, int j)方法无法正确捕获并使用调用时传入的参数,以下是正确的实现方式:
核心实现思路
NSubstitute提供了参数匹配和委托返回的能力,直接在返回逻辑中绑定调用时的参数即可。
1. 根据参数返回对应实例
如果需要根据传入的i和j生成对应的IGamePieceViewModel实例,可按以下方式编写:
// 创建工厂的替代实例 var gamePieceFactory = Substitute.For<IGamePieceFactory>(); // 你的无参Create方法逻辑(保持原有正常代码即可) gamePieceFactory.Create().Returns(new GamePieceViewModel()); // 处理带参数的Create方法,直接获取并使用i、j参数 gamePieceFactory.Create(Arg.Any<int>(), Arg.Any<int>()) .Returns((int i, int j) => new GamePieceViewModel { Row = i, Column = j });
2. 捕获参数执行额外逻辑
如果需要在方法调用时对参数做验证或执行其他操作,可使用Arg.Do:
// 捕获参数并执行自定义逻辑(比如打印参数、验证合法性) gamePieceFactory.Create(Arg.Do<int>(i => { if (i < 0) throw new ArgumentOutOfRangeException(nameof(i)); }), Arg.Do<int>(j => { if (j < 0) throw new ArgumentOutOfRangeException(nameof(j)); })) .Returns((int i, int j) => new GamePieceViewModel { Row = i, Column = j });
3. 限制参数匹配范围
如果只需要匹配符合特定条件的参数,用Arg.Is替代Arg.Any:
// 仅当i和j都大于等于0时,才返回对应实例 gamePieceFactory.Create(Arg.Is<int>(i => i >= 0), Arg.Is<int>(j => j >= 0)) .Returns((int i, int j) => new GamePieceViewModel { Row = i, Column = j });
关键注意事项
Returns的委托参数顺序必须和接口方法Create(int i, int j)的参数顺序完全一致。- 若要同时处理多种参数匹配场景,NSubstitute会按定义顺序优先匹配更具体的规则(比如
Arg.Is会优先于Arg.Any)。
内容的提问来源于stack exchange,提问作者Mark Wardell
相关产品推荐
相关产品推荐

