编写依赖于环境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。