Rails:如何提高I18n转换是在测试环境中缺少异常

Phư*_*yễn 24 testing ruby-on-rails internationalization

我希望Rails在测试环境中缺少I18n转换时引发异常(而不是渲染文本'translation missing').有没有一种简单的方法来实现这一目标?

GMA*_*GMA 23

从Rails 4.1.0开始,现在有一个比4年前这个问题的答案更好的解决方案:在配置文件中添加以下行:

config.action_view.raise_on_missing_translations = true
Run Code Online (Sandbox Code Playgroud)

我喜欢在test环境中设置它,但您可能还想将其设置为development.我强烈建议不要将其设置为真production.

  • 警告:这会在视图和帮助程序中仅提升**错误. (13认同)

elo*_*esp 18

要引发异常,您可以定义一个类来处理本地化错误.

class TestExceptionLocalizationHandler
  def call(exception, locale, key, options)
    raise exception.to_exception
  end
end
Run Code Online (Sandbox Code Playgroud)

然后将其附加到所需的测试用例

I18n.exception_handler = TestExceptionLocalizationHandler.new
Run Code Online (Sandbox Code Playgroud)

这样就可以获得异常.我不知道如何提高失败率(使用flunk)以获得更好的结果.

  • 由于处理程序只需要响应`#call`,你可以使用lambda代替. (3认同)

Jus*_*ner 12

Rails 4.1+

为了提高i18n翻译缺失异常,你需要做件事:

1)初始化程序config/initializers/i18n_force_exceptions.rb:

module I18n
  class ForceMissingTranslationsHandler < ExceptionHandler
    def call(exception, locale, key, options)
      if Rails.env.test?
        raise exception.to_exception
      else
        super
      end
    end
  end
end

I18n.exception_handler = I18n::ForceMissingTranslationsHandler.new
Run Code Online (Sandbox Code Playgroud)

2)config/environments/test.rb(和其他环境中的配置设置):

config.action_view.raise_on_missing_translations = true
Run Code Online (Sandbox Code Playgroud)

注意:除了异常处理程序之外还需要配置设置,因为rails会I18n.translate在其视图中包含调用,并且帮助程序会阻止异常触发.


Bet*_* St 9

我已经将这个初始化程序创建为raise异常 - args被传递,因此您将知道缺少哪个i18n键!

# only for test
if Rails.env.test?

  # raises exception when there is a wrong/no i18n key
  module I18n
    class JustRaiseExceptionHandler < ExceptionHandler
      def call(exception, locale, key, options)
        if exception.is_a?(MissingTranslation)
          raise exception.to_exception
        else
          super
        end
      end
    end
  end

  I18n.exception_handler = I18n::JustRaiseExceptionHandler.new

end
Run Code Online (Sandbox Code Playgroud)

资源


Wol*_*ang 6

或者您可以将这些行添加到您的 config/test.rb

  config.action_view.raise_on_missing_translations = true
  config.i18n.exception_handler = Proc.new { |exception| raise exception.to_exception }
Run Code Online (Sandbox Code Playgroud)