2013-01-10 8 views
9

Mam następującą specyfikację ...Stubbing RestClient odpowiedź w RSpec

describe "successful POST on /user/create" do 
    it "should redirect to dashboard" do 
     post '/user/create', { 
      :name => "dave", 
      :email => "[email protected]", 
      :password => "another_pass" 
     } 
     last_response.should be_redirect 
     follow_redirect! 
     last_request.url.should == 'http://example.org/dave/dashboard' 
    end 
    end 

Sposób post aplikacji Sinatra sprawia połączenia do usługi zewnętrznej przy użyciu REST klienta. Muszę jakoś zablokować pozostałe wywołania klienta, aby odesłać odpowiedzi w puszkach, więc nie muszę wywoływać rzeczywistego połączenia HTTP.

Moje kod aplikacji jest ...

post '/user/create' do 
    user_name = params[:name] 
    response = RestClient.post('http://localhost:1885/api/users/', params.to_json, :content_type => :json, :accept => :json) 
    if response.code == 200 
     redirect to "/#{user_name}/dashboard" 
    else 
     raise response.to_s 
    end 
    end 

Czy ktoś może mi powiedzieć jak to zrobić z RSpec? Przejrzałem Go i natknąłem się na wiele postów na blogu, które podrapały powierzchnię, ale nie mogę znaleźć odpowiedzi. Jestem całkiem nowy w okresie RSpec.

Dzięki

Odpowiedz

15

używając mock do odpowiedzi można to zrobić. Wciąż jestem całkiem nowy dla rspec i testów w ogóle, ale to działało dla mnie.

describe "successful POST on /user/create" do 
    it "should redirect to dashboard" do 
    RestClient = double 
    response = double 
    response.stub(:code) { 200 } 
    RestClient.stub(:post) { response } 

    post '/user/create', { 
     :name => "dave", 
     :email => "[email protected]", 
     :password => "another_pass" 
    } 
    last_response.should be_redirect 
    follow_redirect! 
    last_request.url.should == 'http://example.org/dave/dashboard' 
    end 
end 
+0

Proponuję przeniesienie 'podwójnego' skonfigurowanego do' let' bloku, a 'post' do' przed 'bloku'. – iain

+0

Dzięki za sugestię @iain, ale w ogóle nie jest związana z pytaniem :) Ale tak, powinien on mieć "opisz" blok POST na/user/create'' z 'let (: sucessful_response) {...}' i poprzedni blok, a następnie opis odnoszący się do powodzenia i odpowiedzi błędu. –

+0

Dzięki chłopaki. Wolę używać tego rozwiązania z narzędziami, które już mam, niż zwracać się do stron trzecich i to działa dobrze. – RobA2345

3

Chciałbym rozważyć użycie klejnotu dla zadania takiego jak to.

Dwa z najbardziej popularnych to: WebMock i VCR.

+0

również fakeweb: https://github.com/chrisk/fakeweb – zetetic

+2

Podczas pisania, ostatnie zatwierdzenie na fakeweb było 28 sierpnia 2011 ... –