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

在NSubstitute的Received()中检查复杂参数时测试失败求助

关于NSubstitute调用检查失败的问题排查

嘿,别着急,NSubstitute完全支持这类调用次数和参数匹配的检查,你的思路是对的,大概率是某个细节没处理好,我帮你梳理几个最容易踩的坑:

  • 参数匹配的默认行为坑:
    默认情况下,NSubstitute用引用相等来判断参数是否匹配。也就是说,哪怕你两次传入的MyClass2实例MyString属性都是"test string",但如果是两个不同的对象实例(比如每次new MyClass2 { MyString = "test string" }),NSubstitute会认为这是两个不一样的参数,自然匹配不上你期望的两次调用。

    解决方法很简单,用Arg.Is<T>来基于属性值做匹配,而不是依赖引用:

    // 替换成你实际调用的方法名
    dbOperations.Received(2).YourDbMethod(Arg.Is<MyClass2>(x => x.MyString == "test string"));
    
  • 方法签名是否完全匹配:
    仔细核对你断言的方法和MyMethod里实际调用的dbOperations方法是否完全一致:

    • 方法名有没有拼错?比如是Save还是SaveAsync?
    • 参数类型是否完全对应?有没有重载方法搞混了?
    • 有没有ref/out参数没处理?如果有的话,得用Arg.Ref或者Arg.Out来匹配。
  • 是否在正确的替代实例上断言:
    确认你做Received断言的dbOperations实例,就是被MyMethod实际使用的那个替代实例。有时候不小心创建了多个替代对象,就会出现“我明明调用了,但断言说没调用”的情况。

  • 异步调用的等待问题:
    如果dbOperations的方法是异步的,而你在调用MyMethod之后没有等待异步操作完成就做断言,那此时调用可能还没执行,自然会失败。这种情况要确保用await等待MyMethod完成(如果它是异步方法),或者等待内部任务结束后再检查。

先从这几个点排查,尤其是第一个参数匹配的问题,这是使用NSubstitute时最常见的误区之一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:39:52