如何存根在初始化方法中调用的方法

How to stub a method that is called in initialize method

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

有一个classCompany是这样的:

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已经通过初始化执行了。

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

在实例化 Company 对象之前,即在您执行 Company.new.

之前,测试中的以下行之一应该是 present/run
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)

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

使用双打,例如:

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

有了双打,你可以在不初始化的情况下伪造一个 Company 的实例。所以它不会在你存根之前尝试 运行 navigate_to_search_result

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

Company.stub(:new).and_return(Object)