22

我正在使用领班启动我的rails开发服务器。很高兴我可以将我所有的环境变量放在.env文件中。有没有办法为我的测试环境做类似的事情?如何获取为rspec设置的ENV变量?

我想设置一个API密钥,我将与vcr gem一起使用,但我不想将该API添加到版本控制。除了手动启动测试脚本时手动设置环境变量以外的任何建议?

回答

23

您可以使用dotenv gem ---它的工作方式与领班相同,并从.env文件加载。 (和你的测试环境中.env.test文件)

https://github.com/bkeepers/dotenv

+7

令他们或作为替代,你可以'RAILS_ENV =测试工头运行bundle exec rspec spec' –

+0

这正是我所期待的。谢谢 –

26

如果你只需要设置环境变量,您可以通过命令行设置它们:

SOMETHING=123 SOMETHING_ELSE="this is a test" rake spec 

或者你可以定义你的Rakefile或spec_helper.rb的顶部以下内容:

ENV['SOMETHING']=123 
ENV['SOMETHING_ELSE']="this is a test" 

如果他们并不总是适用,您可以使用条件:

if something_needs_to_happen? 
    ENV['SOMETHING']=123 
    ENV['SOMETHING_ELSE']="this is a test" 
end 

如果你想使用一个工头.env文件,它看起来像:

SOMETHING=123 
SOMETHING_ELSE="this is a test" 

,并把它变成以下和eval它:

ENV['SOMETHING']='123' 
ENV['SOMETHING_ELSE']='this is a test' 

你可以这样做:

File.open("/path/to/.env", "r").each_line do |line| 
    a = line.chomp("\n").split('=',2) 
    a[1].gsub!(/^"|"$/, '') if ['\'','"'].include?(a[1][0]) 
    eval "ENV['#{a[0]}']='#{a[1] || ''}'" 
end 

虽然我没有认为这将适用于多行值。

而@JesseWolgamott指出,它看起来像你可以使用gem 'dotenv-rails'

+0

这个答案特别好,因为它提供的方法不会依赖任何特定的'gem',特别是在使用简单的框架如'Sinatra'时。谢谢! – fagiani

1

一种选择是别名rspec命令更具体。把下面一行放在你的点文件中(.bashrc.profile或其他)。

alias 'rspec'='RACK_ENV=test RAILS_ENV=test bundle exec rspec' 

另一种选择是把环境变量在特定.ENV文件:

# .env.test 

RAILS_ENV=test 
MONGODB_URI=mongodb://localhost/test 
# .. etc .. 

使用dotenv宝石的作品也可以在手动

$ export $(cat .env.test) && rspec