2013-08-06 2 views
0

У меня есть статический метод, который инициирует статическую переменную, вызывая внешний вызов службы. Я хочу отключить этот вызов статического метода, чтобы внешний вызов службы не выполнялся при инициализации переменной класса. вот пример моего кода простыми словами.Как заглушить статические методы класса через rspec

class ABC 
    def self.ini 
     return someCallToMyExternalLibrary # i don't want the execution to go there while testing 
    end 

    @@config = self.ini 

    def method1 
     return @@config['download_URL'] 
    end 
end 

Теперь я хочу незавершенный статический вызов метода с моим объектом, так что @@ конфигурация инициализируются с ответом, который я хочу получить. Я пробовал несколько вещей, и мне кажется, что @@ config не инициализирован моим объектом, а только реализованным вызовом.

describe ABC do 
    let(:myObject) { Util.jsonFromFile("/data/app_config.json")} 
    let(:ABC_instance) { ABC.new } 

    before(:each) do 
     ABC.stub(:ini).and_return(myObject) 
    end 

    it "check the download url" do 
     ABC_instance.method1.should eql("download_url_test") 
     # this test fails as @@config is not getting initialized with my object 
     # it returns the download url as per the implementation. 
    end 

end 

Я даже попытался Штюбинга в spec_helper с, однако, что это будет выполняться первым, прежде чем переменная класса инициализируется, когда выполнение достигает там, но это тоже не помогло. Я застрял с этим сейчас некоторое время. Кто-то, пожалуйста, будь Спасителем.

ответ

1

Ваша проблема заключается в том, что инициализация @@config происходит, пока загружается класс ABC, и вы не можете вмешаться в этот процесс с помощью stubbing. Если вы не можете заглушить внешний вызов, то единственное, что я могу придумать, - это изменить определение класса, чтобы включить отдельный метод инициализации класса.

+0

спасибо Питер, я тоже как-то понял, что с трудом! – manyu

1

Вместо того, чтобы накладывать метод «: ini», который, я полагаю, вы не можете сделать, потому что анализатор проходит определение ABC до вашего вызова, чтобы заглушить метод, я бы предложил установить переменную класса @@ config значение, которое вы хотите на своем перед блоком:

before(:each) do 
    ABC.class_variable_set(:@@config, myObject) 
end 

Тогда попытайтесь выяснить, решит ли это вашу проблему.

+0

Я уже пробовал это, но все же не получаю желаемого ответа, кажется, что синтаксический анализатор читает сообщение ABC.class_variable_set (: @@ config, myObject), разбирающее класс ABC. Есть ли способ сначала проанализировать ABC.class_variable_set (: @@ config, myObject) и установить класс varaible? – manyu

+0

Попробуйте следующее: Удалите let: ABC_instance ... и введите внутри вашего теста «ABC_instance = ABC.new». Разве это имеет значение? –

+0

Нет, это не имеет значения :( – manyu

Смежные вопросы