RSpec, как заглушить open?

Я пытался заглушить open , open -uri версии, и у меня ничего не получается.

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

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

Я также пытался выполнить

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

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

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

8
задан gaqzi 30 August 2010 в 18:46
поделиться

2 ответа

Я нашел решение здесь, в 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
8
ответ дан 5 December 2019 в 07:55
поделиться

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


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

1
ответ дан 5 December 2019 в 07:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: