如何在Rails测试中更改环境变量
你可以这样做
Rails.stub(env: ActiveSupport::StringInquirer.new("production"))
然后Rails.env
,Rails.development?
等将按预期工作。
使用RSpec 3或更高版本时,您可能希望使用新的“零猴子补丁”语法(如@AnkitG在另一个答案中提到)以避免弃用警告:
allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new("production"))
我通常在spec helper中定义一个stub_env
方法,这样我就不必在我的测试中行内输入所有内容。
可以考虑一种选择(如在此处评论中建议的),即依靠一些更有针对性的配置,您可以在环境文件中设置并在测试中进行更改。
'production'.inquiry
代替 ActiveSupport::StringInquirer.new('production')
(参见String#inquiry
) - epidemianRails.env
后,我得到了正确指定的环境,但我的应用程序仍然在错误的环境下运行(通过测试我的环境变量可以确定)。有任何想法为什么会这样? - Noam Hacker自 Rspec 3 开始,您可以执行以下操作:
it "should do something specific for production" do
allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new("production"))
#other assertions
end
puts Rails.env
输出了什么? - AnkitGRails.env
给出了“production”。但是,如果我尝试使用ENV['MY_VARIABLE']
,它将给我一个测试版本而不是生产版本。 - Noam HackerRails.env.production?
的代码,您可以像这样做:it "does something specific when in production" do
allow(Rails.env).to receive(:production?).and_return(true)
##other assertions
end
:development?
、:staging?
等。如果你不需要返回完整环境的全部功能,则这可能是另一个选项。Rails.env.production?
为 true,因为第一次调用需要为 WebMock 的 false,所以我选择了 allow(Rails.env).to receive(:production?).and_return(false, true).twice
。 - HarlemSquirrelallow(Rails).to receive(:env).and_return('production')
或者,像我在shared_examples中所做的那样,将其作为变量传递:
allow(Rails).to receive(:env).and_return(target_env)
我怀疑这不足以解决...StringInquirer...
的问题,因为您的应用程序使用其他方法来检查环境(例如env.production?
),但如果您的代码只是要求Rails.env
,那么这将更易读。结果可能会有所不同。
it "should log something in production" do
Rails.stub(:env).and_return('production')
Rails.logger.should_receive(:warning).with("message")
run_your_code
end
Rails.env.production?
- John Hinnegan