Я пытался заглушить open
, open -uri версии, и у меня ничего не получается.
Я пытался выполнить следующее, но запрос продолжает выполняться:
Kernel.should_receive(:open).and_return("Whatever for now")
Я также пытался выполнить
OpenURI::OpenRead.should_receive(:open).and_return("Whatever for now")
, так как я отследил, где были HTTP-запросы были сделаны в OpenURI.
Заранее благодарен за любые предложения!
Я нашел решение здесь, в Stack Overflow, спустя некоторое время в Google (не могу поверить, что не нашел его раньше).
Объяснение взято из здесь и написано Тони Питлугой (ссылка недоступна).
Если вы вызываете сон в контексте объекта, вы должны заглушить его на объекте[...]
Ключ в том, чтобы заглушить сон тем, чем является «я» в контексте, где вызывается сон.
Итак, я сделал это, и все заработало:
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
Я бы порекомендовал вместо этого использовать что-нибудь для отключения сети. Я считаю, что в настоящее время фаворитом для этого является FakeWeb [docs]. Вас также может заинтересовать fakeweb-matcher для rspec.
Увы, я думаю, что FakeWeb может не работать с open()
, на самом деле он заглушает Net::HTTP
, поэтому я не уверен, что это сработает. Есть ли шанс не использовать open()
? :)