我有以下内容:
request.env['HTTP_REFERER']
并且只有当它跟随哈希查找时才想要存根request.env
。
关于如何做到这一点的任何想法?
答案 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