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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:13:19