使用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
相关产品推荐
相关产品推荐

