如何使用Rspec和.env将环境变量加载到ruby应用程序规范

时间:2019-02-04 19:46:26

标签: ruby rspec

我目前正在为Ruby类编写测试。该类使用环境变量。

当我使用spec运行rspec spec/box_api.rb时,出现以下错误:

Failures:

  1) BoxApi#client success Create Boxr::Client object
     Failure/Error: subject { BoxApi.new }

     KeyError:
       key not found: "BOX_USER_ID"
     # ./src/clients/box_api.rb:8:in `fetch'
     # ./src/clients/box_api.rb:8:in `initialize'
     # ./spec/box_api.rb:14:in `block (4 levels) in <top (required)>'

它不是在读取环境变量。

我尝试在spec文件夹中创建.env.test.local文件,但未成功。我正在使用dotenv宝石:

# Manage environment with .env file
gem 'dotenv', '~> 2.1.1'

如何在测试中使用环境变量?

2 个答案:

答案 0 :(得分:1)

在测试帮助文件中,您可以添加:

require 'dotenv'
Dotenv.load('.env.test.local')

这是在dotenv readme

答案 1 :(得分:1)

您无需在测试中使用dotenv键,而不必为此使用ENV

describe Foo do
  before do
    allow(ENV).to receive(:[]).with('BOX_ID').and_return("1234")
  end

  it 'flips the environment variable value' do
    expect(subject.flip).to eq '4321'
  end
end

甚至将整个ENV存根:

describe Foo do
  let(:env) do
     { 'BOX_ID' => '1234' }
  end

  before do
    stub_const("ENV", env)
  end

  it 'flips the environment variable value' do
    expect(subject.flip).to eq '4321'
  end
end

我发现它比单独的文件更可靠,更易于维护。