如何根据规范更改 Rails 应用程序配置?
How to change Rails application config on a per-spec basis?
我们的 Rails 应用有一个自定义的 404 和 500 页面:
match '/500', :to => 'errors#internal_server_error', :via => :all
我们有一些规格来确保它有效。
在test.rb中:
Rails.application.configure do
config.consider_all_requests_local = false
config.action_dispatch.show_exceptions = true
end
然而,在开发过程中,异常被吞没了,因此很难弄清楚发生了什么。
因此,对于某些测试,我们需要上述配置,而其他规格则需要不同的配置。但是配置是在测试运行之前设置的,所以无法更新。
如何在 before 块中更新单个规范的配置?
Rails 6
编辑:我尝试过的:
Shira 提到了嘲笑,但这似乎没有任何作用。
Rails.application.config.consider_all_requests_local = false
Rails.application.config.action_dispatch.show_exceptions = true
这确实有效,但仅在第一个请求之前。在第一个请求之后它什么都不做。
Rails.application.config.consider_all_requests_local = ->{ ENV['...'] }
这不起作用。
问题似乎是这些配置在中间件中使用,一旦配置了应用程序,更改就不会反映出来。
我试图找到一种方法来重新初始化 Rails 应用程序,但似乎没有办法。
我想唯一的方法是猴子修补中间件以使用带有 ENV 的 Proc...
我不确定是否可以实际更改配置,但您可以模拟此配置:
allow(Rails.application.config).to receive(:consider_all_requests_local).and_return(true)
这个有效:
Rails.application.env_config['action_dispatch.show_exceptions'] = true
Rails.application.env_config['action_dispatch.show_detailed_exceptions'] = false
感谢 Eliot Sykes https://www.eliotsykes.com/realistic-error-responses
我们的 Rails 应用有一个自定义的 404 和 500 页面:
match '/500', :to => 'errors#internal_server_error', :via => :all
我们有一些规格来确保它有效。
在test.rb中:
Rails.application.configure do
config.consider_all_requests_local = false
config.action_dispatch.show_exceptions = true
end
然而,在开发过程中,异常被吞没了,因此很难弄清楚发生了什么。
因此,对于某些测试,我们需要上述配置,而其他规格则需要不同的配置。但是配置是在测试运行之前设置的,所以无法更新。
如何在 before 块中更新单个规范的配置?
Rails 6
编辑:我尝试过的:
Shira 提到了嘲笑,但这似乎没有任何作用。
Rails.application.config.consider_all_requests_local = false
Rails.application.config.action_dispatch.show_exceptions = true
这确实有效,但仅在第一个请求之前。在第一个请求之后它什么都不做。
Rails.application.config.consider_all_requests_local = ->{ ENV['...'] }
这不起作用。
问题似乎是这些配置在中间件中使用,一旦配置了应用程序,更改就不会反映出来。
我试图找到一种方法来重新初始化 Rails 应用程序,但似乎没有办法。
我想唯一的方法是猴子修补中间件以使用带有 ENV 的 Proc...
我不确定是否可以实际更改配置,但您可以模拟此配置:
allow(Rails.application.config).to receive(:consider_all_requests_local).and_return(true)
这个有效:
Rails.application.env_config['action_dispatch.show_exceptions'] = true
Rails.application.env_config['action_dispatch.show_detailed_exceptions'] = false
感谢 Eliot Sykes https://www.eliotsykes.com/realistic-error-responses