在测试过程中改变rails环境

asw*_*ini 39 ruby-on-rails-3

如何在测试中更改rails的环境变量

Hen*_*k N 75

你可以做到

Rails.stub(env: ActiveSupport::StringInquirer.new("production"))
Run Code Online (Sandbox Code Playgroud)

然后Rails.env,Rails.development?等将按预期工作.

使用RSpec 3或更高版本,您可能希望使用新的"零monkeypatching"语法(如另一个答案中的@AnkitG所述)以避免弃用警告:

allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new("production"))
Run Code Online (Sandbox Code Playgroud)

我通常stub_env在spec帮助器中定义一个方法,所以我不必在测试中将所有内容都放在内联中.

要考虑的选项(如此处的评论中所建议的)是依赖于您可以在环境文件中设置并更改测试的更具针对性的配置.

  • 谢谢自己!发现这个并且即将upvote,然后注意到我在6个月前自己写了... (38认同)
  • 您可以使用`'production'.inquiry`而不是`ActiveSupport :: StringInquirer.new('production')`(参见[`String#inquiry`](http://apidock.com/rails/String/inquiry)) (7认同)

Ank*_*itG 17

Rspec 3以后你可以做到

it "should do something specific for production" do 
  allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new("production"))
  #other assertions
end
Run Code Online (Sandbox Code Playgroud)


cjn*_*cjn 5

有时返回不同的环境变量可能会令人头疼(所需的生产环境变量,警告消息等).

根据您的情况,作为替代方案,您可以简单地返回测试所需的值,以便将其视为另一个环境.例如,如果你希望Rails相信它正在生产代码,检查Rails.env.production?你可以做这样的事情:

it "does something specific when in production" do 
  allow(Rails.env).to receive(:production?).and_return(true)
  ##other assertions
end
Run Code Online (Sandbox Code Playgroud)

你可以做其他环境中,如相同:development?,:staging?等等.如果你不需要返回一个完整环境的满负荷生产,这可能是另一种选择.


小智 -3

如果您使用的是 rspec 之类的东西,您可以存根 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
Run Code Online (Sandbox Code Playgroud)

  • 因为它只有在进行字符串比较时才有效。无法“本地”使用它,例如以下内容不起作用“Rails.env.Production?” (2认同)