Frage an rspec-rails – Wie kann man open-uri verspotten?

14

Ich habe diesen einfachen Code, in dem ich http-Anfrage sende und die ganze Antwort lese. Hier ist mein Schienencode

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

Wie kann ich die Spezifikation für diese Codezeile schreiben? Ich habe keine Möglichkeit, Mokka und Webmock zu verwenden. Ich kann nur das spöttische Framework von Rpsec verwenden.

Ich habe versucht, diese Aussage zu verwenden

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

aber ich bekomme immer diesen Fehler

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

Deine Antwort

4   die antwort
3

Ich tat:

my_object.stub_chain(:open, :read) { "my return value" }
Bei der Verwendung von stub_chain in Rspec 3.3.1 wird eine Warnung angezeigt. Was ist neu: Syntax dafür erwarten? Epigene
@Brian Wie neu formatieren? Was möchten Sie erweitern? Verwendenstub_chain  So können Sie anrufenopen("whatever").read innerhalbmy_object und du wirst bekommen"my_return_value" zurück. Henrik N
Du hast recht. Ihre Antwort wurde (aufgrund ihrer Länge) bei der Überprüfung als "schlechte Qualität" eingestuft. Ich habe später in dieser Nacht Nachforschungen angestellt und es stellte sich heraus, dass Ihre Antwort (trotz der Kürze) richtig ist. Ich habe den Kommentar entfernt und Ihrer Antwort +1 gegeben. Entschuldigung, Sir! Brian
2

Laut diesem Linkhttp://destillations.2rye.com/2011/08/mock-the-web-openuri/ Die Open-Funktion ist auf dem Kernel-Modul definiert, jedoch in die Steuerung eingemischt. Daher müssen Sie den Anruf auf dieser Ebene beenden. Diese Lösung eignet sich gut für RSpec-Controller-Tests:

  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
0

Zu stummelnopen-uri Sie können diese Syntax verwendenRSpec 3+

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

open Methode wird auf der Ebene der definiertKernel, aber ich habe mich getäuscht.

Wenn Sie das verspotten möchtenopen, du solltest es auf der tunEbene Ihres Objekts so was:

it "should do something" do
  object_under_test = ObjectUnderTest.new
  object_under_test.should_receive(:open).with("http://example.org")
end
Dies ist nett und Sie können erwarten (object_under_test). Verwenden, um (: open) .with (irgendetwas) .and_return (File.read (File.new (Rails.root.join ("spec / fixtures / images / sample.jpeg") zu empfangen ")))) zum Auslesen einer S3-Datei während eines Tests. Dave Collins

Verwandte Fragen