2015-03-12 4 views
0

Я хочу заглушить метод, который вызывается в методе 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 уже выполняется инициализация.

Как я могу заглушить метод?

ответ

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) 
1

Перемещение метода navigate_to_search_result из метода initialize и вызвать его вручную. Метод initialize обычно используется только для установки.

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