2010-08-30 5 views
8

Я пытался заглушить open, версию с открытым ури, и я не преуспеваю.RSpec как заглушить открытым?

Я попытался сделать следующее, но запрос продолжает идти через:

Kernel.should_receive(:open).and_return("Whatever for now") 

Я также попытался сделать

OpenURI::OpenRead.should_receive(:open).and_return("Whatever for now") 

Поскольку я выследил, что было где были сделаны HTTP запросы в OpenURI.

Заранее благодарим за любые предложения!

ответ

8

Я нашел решение здесь для переполнения стека через некоторое время в Google (я не могу поверить, что раньше этого не нашел).

Пояснение взято из here и написано Tony Pitluga (не ссылка).

Если вы звоните спать в контексте объекта, вы должны окурок его на объект [...]
Ключ, незавершенная спать на то, что «я» в условиях, когда сон называется.

Так что я сделал это, и все получилось:

let(:read) { mock('open') } 

it "should return the new log-level when the log level was set successfully" do 
    read.stub(:read).and_return('log-level set to 1') 
    kannel.should_receive(:open).and_return(read) 

    kannel.set_log_level(1).should == 1 
    end 
+0

Ницца! Я думаю, что разумно изменить это и опубликовать его как решение для 'open()' и принять ваш собственный ответ. Может быть трудно найти статью 'sleep()' при выполнении stubbing 'open()'. – wuputah

+0

Очень хороший момент для того, чтобы окунуться в любой контекст себя. Это помогло мне решить подобную проблему, спасибо! – stuartc

+0

Я обновил ваш код. Объяснение здесь: http://stackoverflow.com/a/11258596/608361 – Zsolt

1

Я бы рекомендовал использовать что-то, чтобы заглушить сеть. Я считаю, что нынешним фаворитом для этого является FakeWeb [docs]. Вы также можете быть заинтересованы в fakeweb-matcher для rspec.


Увы, я думаю, что FakeWeb может не работать с open(), на самом деле, он тушит Net::HTTP, так что я не уверен, что будет работать. Любая вероятность не использовать open()? :)

+0

' open() 'идеально подходит для того, где код идет, поэтому использование' Net: HTTP' напрямую просто будет ошибочным. :) Я потратил еще некоторое время на Google и нашел еще один вопрос переполнения стека, который помог мне. Но спасибо за попытку! – gaqzi

11

Вот что я

class Gateway 

    def do_something 
    open('http://example.com').read 
    end 

end 

В моей спецификации я сделать следующее:

describe 'communication' do 

    it 'should receive valid response from example.com' do 
    gateway = Gateway.new 
    gateway.stub_chain(:open, :read).and_return('Remote server response') 

    gateway.do_something.should == "Remote server response" 
    end 

end 
+0

Я думаю, что это отличный способ решить эту проблему. Спасибо, что напомнили мне :) – nruth

+1

Кроме того, 'Gateway.any_instance.stub_chain (...)' – kgilpin

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