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

