Подтвердить что ты не робот

Rails: как повысить трансляцию I18n, отсутствуют исключения в тестовой среде

Я хочу, чтобы Rails создавал исключение, когда в тестовой среде отсутствует перевод I18n (вместо передачи текста "перевод отсутствует" ). Есть ли простой способ достичь этого?

4b9b3361

Ответ 1

Чтобы поднять исключения, вы можете определить класс для обработки ошибок локализации.

class TestExceptionLocalizationHandler
  def call(exception, locale, key, options)
    raise exception.to_exception
  end
end

Затем вы прикрепляете его к желаемым тестовым сценариям с помощью

I18n.exception_handler = TestExceptionLocalizationHandler.new

Таким образом вы получаете исключения. Я не знаю, как поднимать неудачи (с ломом), чтобы добиться лучших результатов.

Ответ 2

В Rails 4.1.0 теперь есть лучшее решение, чем 4-летние ответы на этот вопрос: добавьте следующую строку в свой файл конфигурации:

config.action_view.raise_on_missing_translations = true

Мне нравится устанавливать это только в среде test, но вы также можете установить его в development. Я бы настоятельно советовал не устанавливать его в значение production.

Ответ 3

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

2) Настройка конфигурации в config/environments/test.rb (и в других средах по мере необходимости):

config.action_view.raise_on_missing_translations = true

Примечание. Параметр config необходим в дополнение к обработчику исключений, потому что rails обертывает вызовы I18n.translate в нем view и помощники, предотвращающие исключения из запуска.

Ответ 4

Я создал этот инициализатор для 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

Источник

Ответ 5

Или вы можете просто добавить эти строки в ваш config/test.rb

  config.action_view.raise_on_missing_translations = true
  config.i18n.exception_handler = Proc.new { |exception| raise exception.to_exception }

Ответ 6

Если вы используете рельсы между 4.0.0 и 4.1.0, вы должны сделать обезьянький патч следующим образом:

module ActionView::Helpers::TranslationHelper
  def t_with_raise(*args)
    value = t_without_raise(*args)

    if value.to_s.match(/title="translation missing: (.+)"/)
      raise "Translation missing: #{$1}"
    else
      value
    end
  end
  alias_method :translate_with_raise, :t_with_raise

  alias_method_chain :t, :raise
  alias_method_chain :translate, :raise
end