Вопрос по – Как rspec mock open-uri?

14

У меня есть этот простой код, куда я отправляю http-запрос и читаю все ответы. Вот мой код рельсов

open("http://stackoverflow.com/questions/ask")

Как я могу написать спецификацию для этой строки кода. У меня нет возможности использовать mocha и webmock. Я могу использовать только фальшивые рамки Rpsec.

Я пытался использовать это утверждение

OpenURI.stub!(:open_uri).should_receive(:open).with("http://stackoverflow.com/questions/ask")

но я продолжаю получать эту ошибку

RSpec::Mocks::MockExpectationError: (#<RSpec::Mocks::MessageExpectation:0xd1a7914>).open("http://stackoverflow.com/questions/ask")
expected: 1 time
received: 0 times

Ваш Ответ

4   ответа
0

open-uri Вы можете использовать этот синтаксисRSpec 3+

file = double('file')
expect(OpenURI).to receive(:open_uri).and_return(file)
3

Я сделал:

my_object.stub_chain(:open, :read) { "my return value" }
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededstub_chainError: User Rate Limit Exceededopen("whatever").readError: User Rate Limit Exceededmy_objectError: User Rate Limit Exceeded"my_return_value"Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
18

Я думал, чтоopen Метод определяется на уровнеKernel, но я был неправ.

Если вы хотите издеваться надopen, вы должны сделать это наlevel of your object как это:

it "should do something" do
  object_under_test = ObjectUnderTest.new
  object_under_test.should_receive(:open).with("http://example.org")
end
Error: User Rate Limit Exceeded
2

По этой ссылкеhttp://distillations.2rye.com/2011/08/mock-the-web-openuri/ функция open определена в модуле ядра, но добавлена в ваш контроллер. Поэтому вам нужно заглушить вызов на этом уровне. Это решение хорошо работает для тестов контроллера RSpec:

  html_content = <<-EOS
          <html><head>
           <title>Some Title</title>
          </head>
          <body>Some Content</body></html>
        EOS

  YourController.any_instance.stub(:open).and_return html_content

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