Ruby on rails 在开发环境中为外部调用创建伪行为

Ruby on rails 在开发环境中为外部调用创建伪行为,ruby-on-rails,ruby,development-environment,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 这让我的代码变得脏兮兮,所以我的问题是:有一种模式(或更好的方法)可以做到这一点吗?我使用的模式是用一种在开发时伪造所有方法的模

我正在编写一段需要搜索外部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()通常被认为是清除外部服务的最佳gem,它还可以让您测试
api_调用
方法如何解析api的响应。

很好,这是一个优雅的解决方案,你有没有在rails的书/文章中读到过它?谢谢,我现在会使用它,直到找到更好的方法(如果有)谢谢,我会尝试一下