为依赖于环境变量的代码编写规范的最佳方法是什么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为依赖于环境变量的代码编写规范的最佳方法是什么?相关的知识,希望对你有一定的参考价值。
我正在测试一些从环境变量中提取配置的代码(由生产中的Heroku配置变量设置,我使用工头进行本地开发)。
使用RSpec测试此类代码的最佳方法是什么?
我想出了这个:
before :each do
ENV.stub(:[]).with("AWS_ACCESS_KEY_ID").and_return("asdf")
ENV.stub(:[]).with("AWS_SECRET_ACCESS_KEY").and_return("secret")
end
如果您不需要测试环境变量的不同值,我想您可以在spec_helper
中设置它们。
那会有用。
另一种方法是在代码和环境变量之间放置一层间接,比如某种易于模拟的配置对象。
你也可以存根常量:
stub_const('ENV', {'AWS_ACCESS_KEY_ID' => 'asdf'})
或者,如果你还想要ENV的其余部分:
stub_const('ENV', ENV.to_hash.merge('AWS_ACCESS_KEY_ID' => 'asdf'))
作为Heroku suggests,您可以使用Foreman的.env
文件来存储用于开发的环境变量。
如果你这样做,你可以使用foreman run
来运行你的规范:
foreman run bundle exec rspec spec
如果您在测试期间使用dotenv设置环境,但需要修改特定测试的env变量,那么以下方法可能很有用。
比存在ENV
更简单的方法是在测试期间替换环境,然后像这样恢复它:
with_environment("FOO" => "baz") do
puts ENV.fetch("FOO")
end
使用像这样的帮手(来自Homebrew source):
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
通过使用ensure
,即使测试失败,原始环境也会恢复。
有一个方便的setting & modifying environment variables during tests方法的比较,包括诅咒ENV
,替换测试之前/之后的值,以及像ClimateControl这样的宝石。
我会避免使用ENV.stub(:[]) - 如果其他东西正在使用ENV,例如pry,则它不起作用(您将收到有关需要存根DISABLE_PRY的错误)。
stub_const正如已经指出的那样运行良好。
您可以使用https://github.com/littleowllabs/stub_env来实现此目的。它允许您存储单个环境变量,而不会像解决方案建议那样将所有变量存根。
安装gem然后写
before :each do
stub_env('AWS_ACCESS_KEY_ID', 'asdf')
stub_env('AWS_SECRET_ACCESS_KEY','secret')
end
你想要的是dotenv gem。
正如@ciastek建议的那样,在领班下运行测试,从CLI运行规范时效果很好。但这并没有帮助我在Sublime Text 2中使用Ruby Test运行规范.Dotenv透明地完成了你的工作。
这个语法对我有用:
module SetEnvVariable
def set_env_var(name, value)
# Old Syntax
# ENV.stub(:[])
# ENV.stub(:[]).with(name).and_return(value)
allow(ENV).to receive(:[]) # stub a default value first if message might be received with other args as well.
allow(ENV).to receive(:[]).with(name).and_return(value)
end
end
以上是关于为依赖于环境变量的代码编写规范的最佳方法是什么?的主要内容,如果未能解决你的问题,请参考以下文章
React Hooks-调用依赖于“一次” useEffect的状态的函数的最佳位置?