如何根据规范更改 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