2012-05-29 16 views
10

Mam ten prosty kod, w którym wysyłam żądanie http i odczytuję całą odpowiedź. Oto mój kod szynyJak rspec makiety open-uri?

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

Jak mogę napisać specyfikację dla tej linii kodu. Nie mam możliwości używania mocha i webmocka. Mogę używać tylko szyderczego schematu Rpsec.

Próbowałem użyć tego komunikatu

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 

Odpowiedz

17

myślałem, że metoda open jest określona na poziomie Kernel, ale myliłem .

Jeśli chcesz mock open, powinien to zrobić na poziomie swojego obiektu tak:

it "should do something" do 
    object_under_test = ObjectUnderTest.new 
    object_under_test.should_receive(:open).with("http://example.org") 
end 
+1

To jest ładne i można korzystać spodziewać (object_under_test) .Aby otrzymać (open) .Za (cokolwiek) .and_return (File.read (File.new (Rails.root.join ("spec/fixtures/images/sample.jpeg")))), aby wyodrębnić plik S3 odczytany podczas testu. –

2

Według tego linka http://distillations.2rye.com/2011/08/mock-the-web-openuri/ otwarta funkcja jest zdefiniowana w module jądra, ale zmieszany z kontrolerem. Dlatego musisz wywołać połączenie na tym poziomie. To rozwiązanie działa dobrze na testach kontroler 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 
3

zrobiłem:

my_object.stub_chain(:open, :read) { "my return value" } 
+0

@ Brian Zmień format jak? Co chciałbyś rozwinąć? Użycie 'stub_chain' w ten sposób oznacza, że ​​możesz wywołać' open ("cokolwiek"). Read 'wewnątrz 'my_object', a otrzymasz' 'my_return_value'' back. –

+0

masz rację. Twoja odpowiedź została sklasyfikowana jako "niska jakość" (ze względu na jej długość) podczas jej recenzowania. Później przeprowadziłem badania i okazało się, że twoja odpowiedź jest poprawna (pomimo zwięzłości). Usunąłem komentarz i dałem +1 twoją odpowiedź. Przepraszam, proszę pana! – Brian

+0

Otrzymuję ostrzeżenie o wycofaniu, gdy używam stub_chain w Rspec 3.3.1. Co nowego: spodziewać się takiej składni? – Epigene

Powiązane problemy