2011-10-24 11 views
6

Io chiamo un servizio web di terzi ora come parte della mia applicazione. Sto usando la gemma RestClient per farlo. Ci sono un sacco di strumenti disponibili per fare la stessa cosa, quindi non dovrebbe importare.Ruby on Rails: il modo migliore per testare una chiamata non riuscita a un'API di terze parti

Quello che mi incuriosisce sono i test abbastanza buoni, niente di eccessivo, in cui posso simulare come la mia applicazione risponde quando il servizio web di terzi non è disponibile per qualsiasi motivo. Sia che abbia superato un limite di velocità o un timeout a causa di latenze/complicazioni della rete, voglio solo essere in grado di prendere qualcosa come un codice di stato HTTP e testare ciò che la mia applicazione fa in quell'evento.

Qual è il modo migliore per farlo con Test :: Unit? In questo momento la chiamata al servizio di terze parti è incapsulata all'interno di uno dei miei controller. Ho un semplice modulo con alcuni metodi wrapper per i diversi endpoint del servizio remoto. Voglio solo assicurarmi che la mia applicazione faccia le cose giuste quando il servizio è o non è disponibile.

Si sta utilizzando un framework aggiuntivo accanto a Test :: Unit che può 'stub' il modo giusto per fare ciò? Ovviamente non posso forzare un timeout di rete e iniziare a hackerare cose come IPtables solo per i test non vale la pena. Sono sicuro che questo problema è stato risolto un milione di volte poiché integrare cose come Facebook e Twitter in applicazioni web è così popolare in questi giorni. Come si fa a verificare l'insuccesso quando si raggiungono tali API in un formato robusto/controllato?

risposta

5

lo consiglio usando qualcosa come webmock per simulare tutte le delle vostre richieste http (non solo per simulare una richiesta non riuscita); accelera notevolmente la tua suite di test invece di dover effettivamente colpire il servizio di terze parti ogni volta che esegui i test.

Webmock supporta Rest Client e Test :: Unit. Basta inserire questo codice nel file di test/test_helper.rb:

require 'webmock/test_unit' 

A titolo di esempio, per testare un timeout di rete:

stub_request(:any, 'www.example.net').to_timeout 
RestClient.post('www.example.net', 'abc') # ===> RestClient::RequestTimeout 
1

railscast: 291 (abbonato solo) parla di test con videoregistratore e RSpec (lo so, non è che non è prova: Unit)

in ogni caso si potrebbe considerare di usare VCR per questo genere di cose

Problemi correlati