【问题标题】:How to stub a method that is called in initialize method如何存根在初始化方法中调用的方法
【发布时间】:2015-03-12 05:31:50
【问题描述】:

我想存根一个在初始化方法中调用的方法。

有一个类Company是这样的:

class Company
  def initialize(code: code, driver: driver)
    @driver = driver
    @code = code
    navigate_to_search_result        
  end

  def navigate_to_search_result
    # do something
  end
end

我想存根方法navigate_to_search_result

before(:each) do
  company = Company.new(code: 7220, driver: Selenium::WebDriver.for(:phantomjs))
  allow(company).to receive(:navigate_to_search_result){ true }  
end

但是这段代码失败了,因为navigate_to_search_result已经被初始化执行了。

我怎样才能像这样存根方法?

【问题讨论】:

    标签: ruby rspec


    【解决方案1】:

    在您实例化 Company 对象之前,即在您执行 Company.new 之前,您的测试中应该存在/运行以下行之一。

    allow_any_instance_of(Company).to receive(:navigate_to_search_result){ true }
    

    allow_any_instance_of(Company).to receive(:navigate_to_search_result).and_return(true)
    

    【讨论】:

      【解决方案2】:

      navigate_to_search_result 方法移出initialize 方法并手动调用它。 initialize 方法通常仅用于设置。

      【讨论】:

      • 确实,#initialize 应该没有副作用,只需在将返回的新实例上设置值即可。
      【解决方案3】:
      Company.stub(:new).and_return(Object)
      

      【讨论】:

        【解决方案4】:

        使用双打,例如:

        before
          company = double(Company, code: 7220, driver: Selenium::WebDriver.for(:phantomjs))
          allow(company).to receive(:navigate_to_search_result){ true } 
        end
        

        使用 doubles,您可以在不初始化的情况下伪造 Company 的实例。所以它不会在你存根之前尝试运行navigate_to_search_result

        但是你在测试什么?也许 stub 可能不是更好的选择,你可以测试方法navigate_to_search_result

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-13
          • 2018-11-30
          • 1970-01-01
          • 2016-09-30
          • 2020-01-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多