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

