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

使用NSubstitute Returns方法时无法传入数组测试骰子掷骰结果

解决NSubstitute中模拟多次骰子掷骰结果的问题

我明白你遇到的困扰了——你想通过TestCase传入数组来模拟多颗骰子的掷出结果,但直接把数组传给NSubstitute的Returns方法根本行不通,对吧?

问题根源

你当前写的Returns(rollResults),NSubstitute会默认把整个数组当作单次调用的返回值,但你的GetRandomNumber方法返回的是单个int类型,类型不匹配自然会报错。而你真正需要的是:每次调用GetRandomNumber时,依次返回数组里的每个元素,来模拟多次掷骰子的随机结果。

最直接的解决方案:用ReturnsMany方法

NSubstitute专门提供了ReturnsMany方法来处理这种“多次调用依次返回不同值”的场景,它可以直接接收你的数组,让被替代的方法每次调用时按顺序取出数组中的元素返回。

把你代码里的这一行:

_randomizer.GetRandomNumber(MIN_VALUE, MAX_VALUE).Returns(rollResults);

替换成:

_randomizer.GetRandomNumber(MIN_VALUE, MAX_VALUE).ReturnsMany(rollResults);

为什么这能解决问题?

  • ReturnsMany会遍历你传入的rollResults数组,每次调用GetRandomNumber时,就返回数组里的下一个int值,完美匹配你模拟多颗骰子掷出结果的需求;
  • 相比手动展开数组元素(比如Returns(rollResults[0], rollResults[1], ...)),ReturnsMany更灵活,不管数组长度多少都能适配。

额外补充:更灵活的自定义返回逻辑

如果之后你需要更复杂的返回规则(比如循环返回某个序列,或者根据调用次数返回不同值),还可以用Returns结合lambda表达式实现:

var callIndex = 0;
_randomizer.GetRandomNumber(MIN_VALUE, MAX_VALUE)
           .Returns(_ => rollResults[callIndex++]);

不过对于你当前的测试场景,ReturnsMany已经是最简洁高效的选择了。

内容的提问来源于stack exchange,提问作者H3ll0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:51:27