在为ruby运行rspec时如何更改环境变量?

时间:2014-12-19 06:36:09

标签: ruby rspec environment-variables

我有几个ruby脚本并使用rspec进行测试。

我把我的环境放在一个env.rb文件中(现在)所以我可以在本地访问它们,并在生产中将它们放在配置变量中。

但是当我运行rspec时,我想要不同的环境变量。两个用例:

  • 我运行Twilio,所以我希望能够将用于测试凭据的SID更改
  • 我将内容作为服务存储在数据库中,并希望拥有一个单独的测试数据库

1 个答案:

答案 0 :(得分:3)

你可以

  • ENV["FOO_BAR"] = "baz"
  • 的上下文中明确设置ENV变量
  • 检查初始化程序中的Rails.env.test?以设置twilio和其他具有测试特定选项的客户
  • 有一个包含所有env设置进行测试的文件,然后使用dotenv

我个人更喜欢仅在创建对象时使用ENV变量,然后将env var值传递给构造函数,因此我可以在不关心ENV的情况下测试对象类,并且我可以测试初始化​​其他对象的对象env var,只是声明创建使用了env var。

所以你要改变像

这样的东西
class Client
  def initialize
    @restclient = RestClient::Resource.new(ENV["API_URL"])
  end
end

class Client
  def initialize(url)
    @restclient = RestClient::Resource.new(url)
  end
end

并且正在初始化该实例然后传递env var

的值
def fetch_content
  client = Client.new(ENV["API_URL"])
  # ...
end

这样你就可以通过传递任何url来测试Client类而不关心env var,然后可以测试实例化client的类

it "uses client" do
  ENV["API_URL"] = "foo.com"
  expect(Client).to receive(:new).with(ENV["API_URL"])  
  subject.fetch_content
end

更新env var的一个问题是更改在测试套件的其余部分中仍然存在,并且如果您不希望在某些测试中存在问题,则可能会导致问题,在这些情况下,您可以使用

expect(ENV).to receive(:[]).with("API_URL").and_return("foo.com")