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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:27:38