【问题标题】:How do I stub a method call followed by hash look up?如何存根方法调用,然后进行哈希查找?
【发布时间】:2016-06-22 14:50:44
【问题描述】:

我有以下几点:

request.env['HTTP_REFERER']

并且只想在 request.env 之后进行哈希查找时存根。

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

【问题讨论】:

  • 为什么你觉得request.env是方法,而不是Hash
  • 我想这并不重要吧?它的返回值是一个哈希。所以这真的是你如何存根哈希查找。
  • request.env 如果您希望该表示法起作用,则必须返回一个对象,但它不必须做任何工作。当该对象调用其[] 方法时,您需要存根。您是否要求一个按需返回存根的存根?

标签: ruby testing rspec rspec3


【解决方案1】:

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

[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"

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 2010-11-07
      相关资源
      最近更新 更多