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

时间:2013-10-09 19:50:09

标签: ruby-on-rails ruby development-environment

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

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

   # api interaction code
   # ...
end

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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