使用NSubstitute模拟函数循环返回值后无法终止问题求助
问题解决:NSubstitute模拟函数循环返回值后终止
错误原因分析
你之前的写法table.NextRow().Returns(myArray[0], myArray.Skip(1).ToArray())存在关键问题:myArray.Skip(1).ToArray()返回的是一个数组对象,而非将数组内的元素逐个传入Returns方法。Returns的params object[]重载会把你传入的每个参数当作一个独立的返回值,实际执行逻辑变成:
- 第一次调用返回
myArray[0] - 第二次调用返回这个
ITable[]数组,但因为返回类型是ITable,NSubstitute无法直接转换,会自动生成一个ITable的模拟实例返回 - 后续所有调用都会重复返回这个模拟实例,永远不会返回
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
相关产品推荐
相关产品推荐

