Как rspec mock open-uri?
У меня есть этот простой код, куда я отправляю http-запрос и читаю все ответы. Вот мой код рельсов
open("http://stackru.com/questions/ask")
Как я могу написать спецификацию для этой строки кода. У меня нет возможности использовать mocha и webmock. Я могу использовать только фальшивые рамки Rpsec.
Я пытался использовать это утверждение
OpenURI.stub!(:open_uri).should_receive(:open).with("http://stackru.com/questions/ask")
но я продолжаю получать эту ошибку
RSpec::Mocks::MockExpectationError: (#<RSpec::Mocks::MessageExpectation:0xd1a7914>).open("http://stackru.com/questions/ask")
expected: 1 time
received: 0 times
4 ответа
Я думал, что open
Метод определяется на уровне Kernel
, но я был неправ.
Если вы хотите издеваться над open
, вы должны сделать это на уровне вашего объекта следующим образом:
it "should do something" do
object_under_test = ObjectUnderTest.new
object_under_test.should_receive(:open).with("http://example.org")
end
Заглушки open-uri
Вы можете использовать этот синтаксис RSpec 3+
file = double('file')
expect(OpenURI).to receive(:open_uri).and_return(file)
Я сделал:
my_object.stub_chain(:open, :read) { "my return value" }
По этой ссылке http://distillations.2rye.com/2011/08/mock-the-web-openuri/ функция открытия определена в модуле ядра, но смешана с вашим контроллером. Поэтому вам нужно заглушить вызов на этом уровне. Это решение хорошо работает для тестов контроллера 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