编写依赖于环境variables的代码规范的最佳方法是什么?

我正在testing一些代码,从环境variables(由生产中的Heroku config vars设置,用于本地开发,我使用工头)来configuration它的configuration。

用RSpectesting这种代码的最好方法是什么?

我想出了这个:

before :each do ENV.stub(:[]).with("AWS_ACCESS_KEY_ID").and_return("asdf") ENV.stub(:[]).with("AWS_SECRET_ACCESS_KEY").and_return("secret") end 

如果你不需要testing环境variables的不同值,我想你可以在spec_helper设置它们。

这将工作。

另一种方法是在你的代码和环境variables之间加上一层间接的,比如某种容易模拟的configuration对象。

你也可以存储常量:

 stub_const('ENV', {'AWS_ACCESS_KEY_ID' => 'asdf'}) 

或者,如果你还想要其他的ENV:

 stub_const('ENV', ENV.to_hash.merge('AWS_ACCESS_KEY_ID' => 'asdf')) 

正如Heroku所build议的那样 ,您可以使用Foreman的.env文件来存储用于开发的环境variables。

如果你这样做,你可以使用foreman run运行你的规格:

 foreman run bundle exec rspec spec 

我会避免ENV.stub(:[]) – 如果其他事情正在使用ENV如pry(你会得到一个关于需要存根DISABLE_PRY错误)不起作用。

stub_const正如已经指出的那样工作良好。

你可以使用https://github.com/littleowllabs/stub_env来实现这一点。; 它允许您存储单个环境variables,而不会像您的解决scheme中提示的那样存储所有这些variables。

安装gem,然后写

 before :each do stub_env('AWS_ACCESS_KEY_ID', 'asdf') stub_env('AWS_SECRET_ACCESS_KEY','secret') end 

你想要的是dotenv的gem 。

按照@ciastek的说法,在foreman下运行testing,在从CLI运行规范时运行得非常好。 但是这并不能帮助我在Sublime Text 2中运行Rubytesting。Dotenv透明地完成了你的工作。

如果您在testing期间使用dotenv来设置您的环境,但需要修改特定testing的envvariables,那么以下方法可能会有用。

一个比stub更简单的方法是在testing期间replace环境,然后像以下那样恢复:

 with_environment("FOO" => "baz") do puts ENV.fetch("FOO") end 

使用这样的帮手(来自Homebrew源 ):

 module Test module Helper module Env def with_environment(partial_env) old = ENV.to_hash ENV.update partial_env begin yield ensure ENV.replace old end end end end end 

即使testing失败,通过使用ensure原始环境恢复。

在testing过程中设置和修改环境variables的方法比较方便,包括对ENV 进行存根, 在testing之前/之后replace值以及诸如ClimateControl之类的gem。