在开发环境中为外部调用创建虚假行为

我正在做一个需要搜索外部API的代码,但在开发期间我无法访问此API,因此我当前运行服务器并在系统中导航的解决方案是:

def api_call return { fake: 'This is a fake return' } if Rails.env.development? # api interaction code # ... end 

这让我的代码变得污垢,所以我的问题是:有一种模式(或更好的方法)来做到这一点?

我使用的模式是将api对象替换为在开发时伪造所有方法的对象。

 class Api def query # perform api query end end class FakeApi def query { fake: 'This is a fake return' } end end # config/environments/production.rb config.api = Api.new # config/environments/test.rb # config/environments/development.rb config.api = FakeApi.new # then def api_call Rails.configuration.api.query # no branching here! code is clean end 

基本上,你有两个类, Api做实际工作和FakeApi返回预先烘焙的假响应。 然后,您可以使用Rails的环境配置在不同的环境中设置不同的api。 这样,您的客户端代码(调用#query )就不必关心当前环境。

Webmock( https://github.com/bblimke/webmock )通常被认为是存储外部服务的最佳gem,并且还具有让您测试api_call方法如何解析API响应的额外好处。