RSpec中验证方法调用导致实际方法未执行的问题咨询
解决RSpec验证方法调用时原方法不执行的问题
你遇到的这个问题其实是RSpec的默认行为导致的:当你用expect(...).to receive(...)去验证方法调用时,RSpec会自动**存根(stub)**这个方法——也就是替换掉原方法的实现,默认返回nil,这就导致method_b根本没执行原逻辑,hash变量变成nil,后续调用delete自然就报错了。
这里有两种完美的解决方式:
1. 让存根的方法执行原逻辑
用RSpec提供的and_call_original方法,它会在验证方法调用的同时,执行原方法的实际逻辑,保留返回值:
it 'calls method_b' do expect(someClass).to receive(:method_b).with(key).and_call_original method_a(key) end
这样一来,method_b会正常返回{ key => 1 },method_a里的hash.delete(key)就能正常执行,测试也能验证到method_b确实被调用了。
2. 手动指定方法返回值
如果原方法的逻辑比较复杂(比如涉及数据库、外部调用),你不想在这个测试里执行实际逻辑,可以用and_return手动模拟返回值:
it 'calls method_b' do expect(someClass).to receive(:method_b).with(key).and_return({ key => 1 }) method_a(key) end
这种方式也能让hash拿到预期的哈希值,避免后续报错,同时完成调用验证。
一般来说,第一种方法更推荐,因为它能保持代码的原有行为,不需要手动维护返回值和原方法的一致性。
内容的提问来源于stack exchange,提问作者Jeff H
相关产品推荐
相关产品推荐

