ruby 在RSpec中接收_message_chain和_wrap_original的好方法是什么?

gdx19jrr  于 2023-06-22  发布在  Ruby
关注(0)|答案(1)|浏览(104)

我想打这个电话:

headers[ 'REMOTE_ADDR' ]

可以用

allow_any_instance_of(RequestHandler).to 
  receive_message_chain(:headers, :[]) do |field|
    '1.2.3.4'
end

但是,我想要一个部分double,所以只有在field == 'REMOTE_ADDR'时返回存根响应。对于其他字段,我想调用原始实现。
根据RSpec docs

expect(API).to receive(:solve_for).and_wrap_original { |m, *args| m.call(*args).first(5) }

然而,这似乎不适用于消息链。我得到:

undefined method `and_wrap_original' for #<RSpec::Mocks::Matchers::ReceiveMessageChain:0x007faef1f3fd20>

那么,在RSpec中创建这个部分double的好方法是什么呢?
rspec-mocks 3.4.1

dgtucam1

dgtucam11#

对于您的特定情况,您可以依赖with方法根据传递的参数来限定double:

allow_any_instance_of(RequestHandler).to receive_message_chain(:headers, :[]).with('REMOTE_ADDR').and_return('1.2.3.4')

相关问题