Не уверен, что это оптимально, но в моих приложениях Rails3 / RSpec2 я проверяю все свои языковые переводы в RSpec следующим образом:
Я устанавливаю доступные языковые стандарты в моих config / initializer/i18n.rb file:
I18n.available_locales = [:en, :it, :ja]
и в моих spec-файлах, требующих проверки перевода, у меня есть тесты, которые выглядят примерно так:
describe "Example Pages" do
subject { page }
I18n.available_locales.each do |locale|
describe "example page" do
let(:example_text) { t('example.translation') }
before { visit example_path(locale) }
it { should have_selector('h1', text: example_text) }
...
end
...
end
end
Я не был уверен, какчтобы получить только метод t()
для использования в спецификациях без необходимости I18n.t
, поэтому я просто добавил небольшой удобный метод в spec / support / utilities.rb :
def t(string, options={})
I18n.t(string, options)
end
Обновление : В настоящее время я склонен использовать гем i18n-tasks для тестирования, связанного с i18n, а не с тем, что я написал выше или отвечал ранее в StackOverflow.
Я хотел использовать i18n в своих тестах RSpec, прежде всего, чтобы убедиться, что у меня есть переводы для всего, то есть не было пропущенных переводов.i18n-tasks может делать это и многое другое с помощью статического анализа моего кода, поэтому мне больше не нужно запускать тесты для всех I18n.available_locales
(за исключением тестирования очень специфичных для локали функций, таких как, например, переключение с любой локалив любой другой язык системы).
Это означает, что я могу подтвердить, что все ключи i18n в системе действительно имеют значения (и что ни один из них не используется или устарел), сохраняя при этом количество повторяющихся тестов,и, следовательно, время выполнения сюиты уменьшилось.