RSpec как заглушка открыть? - PullRequest
       7

RSpec как заглушка открыть?

8 голосов
/ 30 августа 2010

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

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

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

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

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

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

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

Ответы [ 3 ]

12 голосов
/ 25 мая 2012

Вот что я делаю

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
8 голосов
/ 30 августа 2010

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

Объяснение взято из здесь и написано Тони Питлуга (не связывается).

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

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

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
1 голос
/ 30 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...