如何存根方法调用后跟哈希查找?

时间:2016-06-22 14:50:45

标签: ruby testing rspec rspec3

我有以下内容:

request.env['HTTP_REFERER']

并且只有当它跟随哈希查找时才想要存根request.env

关于如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:2)

我假设你想要stub. #[] request.env的方法。一种方法是使用define_singleton_method在request.env中定义单例方法,并覆盖原始的#[]方法。

[19] pry(main)> env = { a: 1 } # or whatever object of a class that has #[]
=> {:a=>1}
[20] pry(main)> env[:a]
=> 1
[21] pry(main)> env.size
=> 2
[22] pry(main)> env.define_singleton_method(:[]) { |key| key.upcase }
=> :[]
[23] pry(main)> env[:a]
=> :A
[24] pry(main)> env.size
=> 2
[25] pry(main)> env.define_singleton_method(:[]) { |key| key == 'HTTP_REFERER' ? 'http://example.com' : super(key) }
=> :[]
[26] pry(main)> env[:a]
=> 1
[27] pry(main)> env['HTTP_REFERER']
=> "http://example.com"

答案 1 :(得分:1)

RSpec.describe Hash do
  subject { described_class.new(foo: :bar) }

  it "returns the value via #[]" do
    expect(subject).to receive("[]").with(:foo)
    subject[:foo]
  end
end

在Ruby中,hash[:foo]只是语法糖。它与在散列上使用参数[]调用方法:foo完全相同:

hash = { foo: :bar }
#=> {:foo=>:bar}
hash.public_send("[]", :foo)
#=> :bar