2014-08-28 15 views
11

Ich versuche, unerwartetes Verhalten von einer Web-API zu simulieren, wie zum Beispiel nicht den Server und Timeouts zu finden, mit webmock.WebMock simulieren fehlgeschlagene API (kein Internet, Timeout ++)

Was wäre der beste Weg, dies zu tun? Alle ich denken kann, ist, so etwas zu tun:

stubbed_request = stub_request(:get, "#{host}/api/something.json"). 
with(:headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby'}). 
to_return(:status => [500, "Internal Server Error"]) 

Das ist für Dinge wie 404 usw. funktionieren sollte, aber wie kann ich testen Timeouts, Server und nicht/Offline-Server gefunden keine Internetverbindung?

Antwort

15

Nach etwas Graben habe ich einige Lösungen gefunden.

Anscheinend können Sie die to_return(...) zu to_timeout ändern, die einen Zeitüberschreitungsfehler werfen wird. Sie können auch to_raise(StandardError) haben. Für vollständige Referenz siehe https://github.com/bblimke/webmock#raising-timeout-errors.

stubbed_request = stub_request(:get, "#{host}/api/something.json"). 
with(:headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby'}). 
to_timeout 

Raise Standarderror oder kein Internet/andere Ausnahme, Beispiel:

stubbed_request = stub_request(:get, "#{host}/api/something.json"). 
with(:headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby'}). 
to_raise(StandardError) 

#Error example 2: 
stubbed_request = stub_request(:get, "#{host}/api/something.json"). 
with(:headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby'}). 
to_raise("My special error") 

Dort gehen Sie, nicht zu hart

Timeout oder Server nicht, Beispiel gefunden Letztendlich.


Ich habe keine Ahnung, wie ich das beim ersten Mal nicht gefunden habe. Hoffentlich hilft das jemandem eines Tages.

+0

Das half mir, schämte mich, dass ich 'to_raise' und' to_timeout' nicht früher gefunden habe. Vielen Dank! –

+0

Seltsam, wenn ich 'to_timeout' verwende, kann ich nicht vermeiden, dass 'RestClient :: RequestTimeout 'ausgelöst wird und meine Testfehler herauskommen. Wenn ich 'to_raise' in irgendeiner Weise verwende, bekomme ich einen 'SystemStackError: stack level zu tief'. – Todd

+0

Um ehrlich zu sein, es klingt wie du einen Fehler in deinem Code hast: / – Automatico