Pytanie w sprawie rspec-rails – Jak spreparować makiety otwartego uri?

14

Mam ten prosty kod, w którym wysyłam żądanie http i czytam całą odpowiedź. Oto mój kod szyny

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

Jak mogę napisać specyfikację dla tej linii kodu. Nie mam opcji używania mokki i webmocka. Mogę używać tylko drwiącej struktury Rpsec.

Próbowałem użyć tego stwierdzenia

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

ale wciąż otrzymuję ten błąd

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

Twoja odpowiedź

4   odpowiedź
2

Zgodnie z tym linkiemhttp://distillations.2rye.com/2011/08/mock-the-web-openuri/ funkcja open jest zdefiniowana w module Kernel, ale zmieszana z kontrolerem. Dlatego musisz odebrać połączenie na tym poziomie. To rozwiązanie sprawdza się dobrze w testach kontrolera 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
0

Do stubopen-uri możesz użyć tej składniRSpec 3+

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

open metoda jest zdefiniowana na poziomieKernel, ale byłem w błędzie.

Jeśli chcesz wyśmiaćopen, powinieneś to zrobić napoziom obiektu lubię to:

it "should do something" do
  object_under_test = ObjectUnderTest.new
  object_under_test.should_receive(:open).with("http://example.org")
end
Jest to miłe i możesz użyć expect (object_under_test) .do otrzymania (: open) .with (cokolwiek) .and_return (File.read (File.new (Rails.root.join ("spec / fixtures / images / sample.jpeg „)))), aby wykluczyć odczyt pliku S3 podczas testu. Dave Collins
3

Zrobiłem:

my_object.stub_chain(:open, :read) { "my return value" }
Otrzymuję ostrzeżenie o przestarzałości podczas używania stub_chain w Rspec 3.3.1. Co nowego: spodziewaj się składni? Epigene
@Brian Zmień formatowanie? Co chciałbyś rozszerzyć? Za pomocąstub_chain  w ten sposób możesz zadzwonićopen("whatever").read w ciągumy_object i dostaniesz"my_return_value" z powrotem. Henrik N
masz rację. Twoja odpowiedź została sklasyfikowana jako „niska jakość” (ze względu na jej długość), kiedy ją przeglądałem. Później zrobiłem kilka badań i okazało się, że twoja odpowiedź jest poprawna (pomimo zwięzłości). Usunąłem komentarz i dałem +1 odpowiedzi. Przepraszam, sir! Brian

Powiązane pytania