【问题标题】:Modify Rails i18n config during a test?在测试期间修改 Rails i18n 配置?
【发布时间】:2016-06-16 18:00:20
【问题描述】:

我正在尝试测试一个 Rails 插件,以确保无论是否打开 fallbacks 都能执行正确的操作。在我的 Dummy 应用程序的配置中,我有:

module Dummy
  class Application < Rails::Application
    config.i18n.fallbacks = true
  end
end

如何将其转回 false 以进行特定测试?到目前为止,我已经尝试过:

Dummy::Application.config.i18n.fallbacks = false
Dummy::Application.configure do |app|
  app.config.i18n.fallbacks = false
end
Rails.application.config.i18n.fallbacks = false

一切都无济于事。

【问题讨论】:

  • @karlingen 这是在 rspec 中测试类似情况的好方法,但我不知道如何在这里应用它?

标签: ruby-on-rails minitest ruby-on-rails-plugins


【解决方案1】:

这是一个有趣的问题,实际上一旦应用程序一开始就被初始化,你就无法更改 i18n 配置,因为它已经被这些 codes 记忆:

# Setup i18n configuration.
def self.initialize_i18n(app)
  return if @i18n_inited
  ...
  @i18n_inited = true
end

I18n.fallbacks 是用这个line 设置的

I18n.fallbacks = I18n::Locale::Fallbacks.new(*args)

当您将callbacks 指定为true 时,I18n.fallbacks 的值为

[1] pry(main)> I18n.fallbacks
=> {}
[2] pry(main)> I18n.fallbacks.class
=> I18n::Locale::Fallbacks

I18n.fallbacks用在这个way中:

locales.concat(I18n.fallbacks[I18n.locale]) if I18n.respond_to? :fallbacks

只要I18n.respond_to? :fallbacks,应用就会一直开启回退功能。

方法在I18n中定义here

def fallbacks
  @@fallbacks ||= I18n::Locale::Fallbacks.new
end

要关闭回退功能,唯一的方法是让I18n.respond_to? :fallbacks 返回false

给你:

class << I18n
  remove_method :fallbacks
end

【讨论】:

  • 拉里,感谢您的帮助。看起来这不是唯一使用后备的地方。我现在可能只需要离开这个测试。我想我无论如何都在测试底层代码,这很愚蠢。
猜你喜欢
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 2017-08-04
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多