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

RSpec如何链式调用receive().with()验证方法调用链?

RSpec 原生支持链式调用的测试能力,对应的API是receive_message_chain,完全可以替代你现在冗长的手动mock中间对象的写法。

你需求的测试逻辑可以直接简化为一行代码:

expect(Delayed::Job).to receive_message_chain(:where, :delete_all).with(queue: 'produceable', locked_at: nil)

如果要更明确的指定每个链式方法的入参,也可以用哈希形式的传参写法:

expect(Delayed::Job).to receive_message_chain(where: [{queue: 'produceable', locked_at: nil}, :delete_all])

补充几个使用注意点:

  • 若你只需要校验整条方法链的调用和入参匹配,不需要对中间返回的对象做额外的行为校验,receive_message_chain是最优选择
  • 如果你需要对中间where返回的ActiveRecord::Relation对象做更多的调用校验,再考虑使用你原有的手动创建instance_double的方案
  • 需要给链式调用末尾的方法指定返回值时,直接在后面拼接and_return即可:
# 示例:模拟delete_all执行后删除了3条记录
expect(Delayed::Job).to receive_message_chain(:where, :delete_all)
  .with(queue: 'produceable', locked_at: nil)
  .and_return(3)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:06:03