RSpec中receive_message_chain和and_wrap_original的好方法是什么?

时间:2016-03-01 00:29:43

标签: ruby rspec

我想嘲笑这个电话:

headers[ 'REMOTE_ADDR' ]

可以用

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

但是,我想要一个部分加倍,所以只返回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中创建这个部分双精度的好方法是什么?

rspec-mocks 3.4.1

1 个答案:

答案 0 :(得分:0)

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

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