如何存根在初始化方法中调用的方法
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)
我想存根一个在初始化方法中调用的方法。
有一个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
.
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)