我想存根一个在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
已经通过初始化执行了。
我怎么能这样的存根方法?
答案 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(对象)