Search code examples
rubyrspecwebmock

WebMock simulate failing API (no internet, timeout ++)


I am trying to simulate unexpected behaviour from a web api, such as not finding the server and timeouts, using webmock.

What would be the best way to do this? All I can think of is to do something like this:

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"])

That should work for things like 404 etc., but how can I test timeouts, server not found/offline server, and no internet connection?


Solution

  • After some digging I found some solutions to this.

    Apparently you can change the to_return(...) to to_timeout, which will throw a timeout error. You can also have to_raise(StandardError). For full reference, see https://github.com/bblimke/webmock#raising-timeout-errors.

    Timeout, or server not found, example:

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

    Raise StandardError, or no internet/other exception, example:

    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")
    

    There you go, not too hard after all.


    I have no idea how I didn't find this the first time. Anyway, hope this helps someone out one day.