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

使用NSubstitute模拟嵌套接口时,调用次数验证异常问题

问题分析与解决

这是你测试代码操作有误,并非NSubstitute的预期行为问题,具体原因和修正方案如下:

问题根源

  1. 重复调用导致次数翻倍:你在测试中手动执行了一次mockedWrapper.UseClassB().DoSomething();,随后又调用run(mockedWrapper),而run方法内部会再次执行wrapper.UseClassB().DoSomething();(这里注意run方法参数名是myWrapper,内部写成wrapper是笔误,会导致编译失败)。两次完整调用链叠加后,DoSomething()实际被执行了2次,这就是必须用Received(2)才能通过验证的直接原因。

  2. NSubstitute调用链验证逻辑:你写的mockedWrapper.Received().UseClassB().DoSomething();本质是分两步验证:

    • 先验证mockedWrapper.UseClassB()被调用了指定次数
    • 再验证UseClassB()返回对象的DoSomething()被调用了指定次数
      NSubstitute并没有把UseClassB()的调用次数计入DoSomething(),只是你的两次完整调用链导致两个方法的调用次数都变成了2次。

修正方案

如果要验证run方法是否正确调用了1次DoSomething(),需要去掉测试中手动执行的调用行,修正后的测试代码如下:

var mockedWrapper = Substitute.For<MyWrapperClass>();

run(mockedWrapper);

// 验证完整调用链执行1次
mockedWrapper.Received(1).UseClassB().DoSomething();

// 或者分开验证,逻辑更清晰
// mockedWrapper.Received(1).UseClassB();
// mockedWrapper.Received(1).DoSomething();

同时修正run方法的笔误:

public void run(IMyInterface myWrapper){
    myWrapper.UseClassB().DoSomething();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:22:50