2014-08-28 91 views
11

我想模拟Web api的意外行为,如找不到服务器和超时,使用webmock。WebMock模拟失败的API(没有互联网,超时++)

这样做的最好方法是什么?所有我能想到的是做这样的事情:

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

这应该为工作的事情像404等,但我怎么能测试超时服务器找不到/脱机服务器,并无互联网连接

回答

15

经过一番挖掘,我找到了一些解决方案。

显然你可以将to_return(...)更改为to_timeout,这会引发超时错误。您也可以有to_raise(StandardError)。有关完整参考,请参阅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 

提高StandardError的,或没有互联网 /其他异常,例如:

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

你去那里,不要太用力毕竟。


我不知道我怎么第一次没有找到这个。无论如何,希望这有助于某一天的某个人。

+0

这确实帮了我很大忙,因为我没有及时发现'to_raise'和'to_timeout'。谢谢! – 2015-02-20 01:55:26

+0

奇怪的是,如果我使用'to_timeout',我不能避免抛出'RestClient :: RequestTimeout',并且测试出错。如果我以任何方式使用'to_raise',我会得到'SystemStackError:堆栈层太深'。 – Todd 2016-07-23 03:18:30

+0

说实话,这听起来像你有你的代码中的错误:/ – Automatico 2016-07-23 12:13:15