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

我有几个ruby脚本并用rspec测试它们。

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

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

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

您可以

  • 使用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")