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

Tim*_* T. 8 ruby rspec environment-variables

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

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

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

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

raf*_*fb3 6

你可以

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

我个人更喜欢仅在创建对象时使用 ENV var,然后将 env var 值传递给构造函数,这样我就可以测试对象类而不关心 ENV,并且我可以测试使用 env var 初始化另一个对象的对象,通过断言创建使用了环境变量。

所以你会改变类似的东西

class Client
  def initialize
    @restclient = RestClient::Resource.new(ENV["API_URL"])
  end
end
Run Code Online (Sandbox Code Playgroud)

class Client
  def initialize(url)
    @restclient = RestClient::Resource.new(url)
  end
end
Run Code Online (Sandbox Code Playgroud)

并让初始化该实例的任何内容然后传递环境变量的值

def fetch_content
  client = Client.new(ENV["API_URL"])
  # ...
end
Run Code Online (Sandbox Code Playgroud)

这样,您可以Client通过传递任何 url 来测试类,而无需关心环境变量,然后可以测试实例化 as 的client

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

更新环境变量的一个问题是,该更改会在测试套件的其余部分中持续存在,如果您不希望它出现在某些测试中,则可能会导致问题,在这些情况下,您可以使用以下命令来模拟该值

expect(ENV).to receive(:[]).with("API_URL").and_return("foo.com")
Run Code Online (Sandbox Code Playgroud)

  • 理想情况下,您应该在“before(:each)”中重复设置。请注意,使用环境变量的特点之一是,一旦您在测试上设置它,所有其他测试都将具有该值,这可能是无害的,但最好记住,如果您看到单独运行时通过但失败的测试与套件的其余部分一起运行时 (2认同)