2009-04-21 12 views
11

Pracuję nad aplikacją, która dociera do usługi WWW. Chciałbym rozwinąć klasę proxy, która zwraca fałszywą odpowiedź z usługi, więc nie muszę ciągle trafiać na nią z prośbami podczas opracowywania/testowania innych części aplikacji.Wygeneruj odpowiedź HTTP w języku Ruby

Moja aplikacja oczekuje odpowiedzi wygenerowanej przez Net :: HTTP.

response = Net::HTTP.get(URI.parse('http://foo.com')) 

case response 
when Net::HTTPOK 
    # do something fun 

when Net::HTTPUnauthorized 
    # you get the idea 

Jak mogę wytworzyć obiekt odpowiedzi, nadać mu wszystkie właściwe nagłówki, zwrócić ciąg znaków itp.?

response = ProxyClass.response_object 

case response 
when Net::HTTPOk 
    # my app doesn't know it's being lied to 

Dzięki.

Odpowiedz

8

Zacznę od FakeWeb i zobaczę, czy to spełnia twoje potrzeby. Jeśli nie, możesz prawdopodobnie wypatroszyć wszystko, czego potrzebujesz, od wewnętrznych elementów i stworzyć własne rozwiązanie.

2

Zajrzałbym do kpiny z biblioteki, takiej jak mocha.

Następnie powinieneś być w stanie skonfigurować makiety obiektu do pomocy testu:

def setup 
@http_mock = mock('Net::HTTPResponse') 
@http_mock .stubs(:code => '200', :message => "OK", :content_type => "text/html", :body => '<title>Test</title><body>Body of the page</body>') 
end 

Zobacz Tim Stephenson's RaddOnline blog dla pełniejszego tutoriala, gdzie zahaczonego ten przykład.

0

Chciałbym użyć FakeWeb, jak wspomniano powyżej, lub zlecić moje zadanie testu prowizji uruchomić instancję Webrick do małej aplikacji Sinatra, która kpi z różnych odpowiedzi testowych, które masz nadzieję zobaczyć.

1

Do testowania klienta usług internetowych używamy Sinatra, uroczej, niewielkiej, lekkiej konstrukcji internetowej, która pozwala szybko i łatwo uruchomić coś. Sprawdź stronę główną; ma całą aplikację Hello World w 5 liniach kodu i dwie komendy do zainstalowania i uruchomienia całej rzeczy.

0

Możesz zajrzeć do używania Rack do tego, co powinno pozwolić ci zrobić wszystko, czego potrzebujesz.

15

Właściwie nietrudno jest przetasować własne fałszywe odpowiedzi bezpośrednio za pomocą Net :: HTTP. Oto prosty 200 OK z nagłówkiem cookie:

def fake_response 
    net_http_resp = Net::HTTPResponse.new(1.0, 200, "OK") 
    net_http_resp.add_field 'Set-Cookie', 'Monster' 
    RestClient::Response.create("Body goes here", net_http_resp, nil) 
end 

Ponieważ niewielu z nas korzysta surowego Net :: HTTP już, The (opcjonalnie) Ostatnia linia owija go jako RestClient::Response, które następnie mogą być zgaszone w RestClient :

stub(RestClient).post(anything) { fake_response } 
+0

Dzięki, czasami ludzie polegają na dziwnych bibliotekach, chociaż http ma być tak prosty. Dobrze wiedzieć, że Ruby wbudował się, aby wygenerować całkowitą minimalną odpowiedź http. – Alan

+3

FYI, Net :: HTTP używa łańcuchów do reprezentowania kodów odpowiedzi HTTP, odpowiedź '200' powinna być' '200'' – Lolindrath

+0

widać, że dobrze to wykorzystasz w bibliotece HTTParty https://github.com/jnunemaker/ httparty/blob/master/spec/support/stub_response.rb – 23tux

5

znam ten post jest stary, ale zamiast FakeWeb który wydaje się być w dużej mierze martwy, spróbuj webmock. Wydaje się być bardziej w pełni funkcjonalny i bardzo aktywny.