如何为 rspec 设置 ENV 变量?

Posted

技术标签:

【中文标题】如何为 rspec 设置 ENV 变量?【英文标题】:How do I get an ENV variable set for rspec? 【发布时间】:2013-05-26 18:13:48 【问题描述】:

我正在使用工头来启动我的 Rails 开发服务器。很高兴我可以将我所有的环境变量放在.env 文件中。有没有办法为我的测试环境做类似的事情?

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

【问题讨论】:

【参考方案1】:

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

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 这样的简约框架时。谢谢!【参考方案2】:

您可以使用 dotenv gem --- 它的工作原理与 foreman 相同,并从 .env 文件加载。 (以及用于您的测试环境的 .env.test 文件)

https://github.com/bkeepers/dotenv

【讨论】:

或者,您也可以RAILS_ENV=test foreman run bundle exec rspec spec 这正是我想要的。谢谢【参考方案3】:

一种选择是将 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 gem 可以工作,或者您可以手动将它们引入

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

【讨论】:

以上是关于如何为 rspec 设置 ENV 变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 rspec 包含/设置可见的辅助方法?

.env 未使用 rspec 在 Rails 的测试环境中加载

如何为运行脚本设置自定义环境变量

Upstart env 节没有为 Node.js 应用程序设置环境变量(如 NODE_ENV)

Android:如何为参数变量设置默认值

如何为 ApolloClient 设置环境变量,该变量应该在 CI/CD 的服务器端呈现