2013-01-10 30 views
9

Ho il seguente spec ...Stubbing RestClient risposta in 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 

il metodo POST sull'applicazione Sinatra effettua una chiamata a un servizio esterno con resto-client. Devo in qualche modo bloccare la chiamata al resto del client per inviare risposte predefinite in modo che non debba richiamare una chiamata HTTP effettiva.

Il mio codice applicazione è ...

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 

Qualcuno può dirmi come faccio questo con RSpec? Ho cercato su Google e ho incontrato molti post del blog che graffiano la superficie, ma non riesco a trovare la risposta. Sono abbastanza nuovo al periodo di RSpec.

Grazie

risposta

15

Utilizzando un mock per la risposta si può fare questo. Sono ancora abbastanza nuovo per rspec e test in generale, ma questo ha funzionato per me.

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

Suggerirei di spostare l'impostazione 'doppia' in un blocco' let' e il 'post' in un blocco' before'. – iain

+0

Grazie per il suggerimento @iain ma non collegato affatto alla domanda :) Ma sì, dovrebbe avere un blocco 'descrivi 'POST su/user/create'' con un' let (: sucessful_response) {...} ' e il blocco precedente e poi una descrizione per il successo e la risposta all'errore. –

+0

Grazie ragazzi. Preferisco usare questa soluzione con gli strumenti che ho già, piuttosto che rivolgersi a una terza parte e questo funziona bene. – RobA2345

3

Vorrei prendere in considerazione l'utilizzo di una gemma per un'attività come questa.

Due dei più popolari sono WebMock e VCR.

+0

anche fakeweb: https://github.com/chrisk/fakeweb – zetetic

+2

Al momento della scrittura, l'ultimo commit su fakeweb era 28 agosto 2011 ... –

Problemi correlati