如何存根在initialize方法中调用的方法

时间:2015-03-12 05:31:51

标签: ruby rspec

我想存根一个在initialize方法中调用的方法。

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

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

4 个答案:

答案 0 :(得分:3)

在您实例化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)

答案 1 :(得分:2)

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

答案 2 :(得分:0)

使用双打,如:

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

使用双打,您可以在不初始化的情况下伪造公司实例。因此,在存根之前不会尝试运行navigate_to_search_result

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

答案 3 :(得分:0)

Company.stub(新).and_return(对象)