如何为rspec设置环境变量?

46
我正在使用foreman启动我的Rails开发服务器。把所有环境变量放在.env文件中很不错,那么是否有一种类似的方法可以适用于我的测试环境呢?
我想设置一个API密钥,我将使用vcr gem来使用它,但是我不想将API添加到版本控制中。除了在启动测试脚本时手动设置环境变量之外,还有其他建议吗?
3个回答

45
如果您只需要设置环境变量,可以通过命令行来设置它们。
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

如果你想使用一个类似下面这样的Foreman .env文件:
SOMETHING=123
SOMETHING_ELSE="this is a test"

将其转换为以下内容并进行评估:
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'

这个答案特别好,因为它提供了一些方法,不会依赖于任何特定的gem,尤其是在使用像Sinatra这样的极简框架时。谢谢! - fagiani

34
你可以使用dotenv gem --- 它会像foreman一样运行,并从.env文件中加载。(还有一个.env.test文件供你的测试环境使用) https://github.com/bkeepers/dotenv

11
或者,作为替代方案,您可以使用以下命令:RAILS_ENV=test foreman run bundle exec rspec spec - Jesse Wolgamott

4

一个选项是将rspec命令别名更加具体化。在你的dotfiles(.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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接