3

我正在编写需要搜索外部 API 的代码,但在开发过程中我无法访问此 API,因此我当前运行服务器和浏览系统的解决方案是:

def api_call
   return { fake: 'This is a fake return' } if Rails.env.development?

   # api interaction code
   # ...
end

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

4

2 回答 2

4

我使用的模式是将 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)不必关心当前环境。

于 2013-10-09T19:54:51.793 回答
2

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

于 2013-10-09T20:35:55.043 回答