Я хочу, чтобы Rails создавал исключение, когда в тестовой среде отсутствует перевод I18n (вместо передачи текста "перевод отсутствует" ). Есть ли простой способ достичь этого?
Rails: как повысить трансляцию I18n, отсутствуют исключения в тестовой среде
Ответ 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