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

使用NSubstitute模拟函数循环返回值后无法终止问题求助

问题解决:NSubstitute模拟函数循环返回值后终止

错误原因分析

你之前的写法table.NextRow().Returns(myArray[0], myArray.Skip(1).ToArray())存在关键问题:myArray.Skip(1).ToArray()返回的是一个数组对象,而非将数组内的元素逐个传入Returns方法。Returns的params object[]重载会把你传入的每个参数当作一个独立的返回值,实际执行逻辑变成:

  1. 第一次调用返回myArray[0]
  2. 第二次调用返回这个ITable[]数组,但因为返回类型是ITable,NSubstitute无法直接转换,会自动生成一个ITable的模拟实例返回
  3. 后续所有调用都会重复返回这个模拟实例,永远不会返回null,导致循环无限执行直到内存溢出

正确实现方式

直接将整个数组传给Returns方法即可,它会自动依次返回数组中的每个元素,当所有指定值返回完毕后,后续调用会自动返回引用类型的默认值null,刚好满足循环终止的需求:

var myArray = new[] { returnThis, returnThis2, returnThis3 };
table.NextRow().Returns(myArray);

如果需要手动追加null(比如数组为空时确保第一次调用就返回null),也可以这样写:

table.NextRow().Returns(myArray.Append(null).ToArray());

这样循环会严格执行myArray.Length次,第myArray.Length + 1次调用返回null,循环正常终止。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:31:11