6

我现在调用第三方 Web 服务作为我的应用程序的一部分。我正在使用 RestClient gem 来执行此操作。有很多工具可以做同样的事情,所以这无关紧要。

我很好奇的是有足够好的测试,没有什么太花哨的,我可以模拟我的应用程序在第三方 Web 服务因任何原因不可用时如何响应。由于网络延迟/复杂性,我超过了速率限制或超时,我只想能够获取 HTTP 状态代码之类的内容并测试我的应用程序在该事件中的作用。

使用 Test::Unit 执行此操作的最佳方法是什么?现在,对第三方服务的调用被封装在我的一个控制器中。我有一个简单的模块,其中包含一些用于远程服务不同端点的包装方法。我只想确保我的应用程序在服务可用或不可用时执行正确的操作。

是否在 Test::Unit 旁边使用了一个可以“存根”执行此操作的正确方法的附加框架?显然,我不能强制网络超时,并且为了测试而开始使用 IPtables 之类的东西是不值得的。我确信这个问题已经解决了一百万次,因为如今将 Facebook 和 Twitter 等东西集成到 Web 应用程序中非常流行。当以健壮/受控的格式访问这些 API 时,您如何测试失败?

4

2 回答 2

5

我建议使用类似webmock的东西来模拟你所有的 http 请求(不仅仅是模拟失败的请求);它将大大加快您的测试套件的速度,而不必每次运行测试时都实际访问第三方服务。

Webmock 支持 Rest Client 和 Test::Unit。只需将此代码放入您的test/test_helper.rb文件中:

require 'webmock/test_unit' 

例如,要测试网络超时:

stub_request(:any, 'www.example.net').to_timeout
RestClient.post('www.example.net', 'abc')    # ===> RestClient::RequestTimeout
于 2011-10-24T23:01:29.513 回答
1

railscast:291(仅限订阅者)谈论使用 VCR 和 rspec 进行测试(我知道,这不是 Test:Unit)

无论如何,您可以考虑将VCR用于此类事情

于 2011-10-24T22:57:33.177 回答