我正在编写需要搜索外部 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
)就不必关心当前环境。
关于ruby-on-rails - 在开发环境中为外部调用创建假行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19281238/