Как добавить тест перевода в мои спецификации? Что-то вроде:
flash[:error].should == I18n.translate 'error.discovered'
это не работает, конечно. Как заставить его работать?
Я хочу убедиться, что у меня есть некоторая ошибка.
Как добавить тест перевода в мои спецификации? Что-то вроде:
flash[:error].should == I18n.translate 'error.discovered'
это не работает, конечно. Как заставить его работать?
Я хочу убедиться, что у меня есть некоторая ошибка.
В моем коде проект rails3, используя rspec2, это точно строка, которую я пишу:
describe "GET 'index'" do
before do
get 'index'
end
it "should be successful" do
response.should be_redirect
end
it "should show appropriate flash" do
flash[:warning].should == I18n.t('authorisation.not_authorized')
end
end
Итак, я не уверен, почему вы говорите, что это невозможно?
Не уверен, что это оптимально, но в моих приложениях Rails3/RSpec2 я тестирую все мои языковые переводы в RSpec следующим образом:
Я устанавливаю доступные локали в файле config/initializers/i18n.rb:
I18n.available_locales = [:en, :it, :ja]
и в моих спецификационных файлах, которые требуют проверки перевода, у меня есть тесты, которые выглядят примерно так:
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-задачи могут делать это и многое другое посредством статического анализа моего кода, поэтому мне больше не нужно запускать тесты для всех I18n.available_locales
(кроме того, когда тестируются очень специфичные для локали функции, например, например, переход из любой локали к любому другому языку в системе).
Это означало, что я могу подтвердить, что все ключи i18n в системе действительно имеют значения (и что ни один из них не используется или не устарел), сохраняя при этом количество повторяющихся тестов и, следовательно, время выполнения набора, вниз.
Предполагая, что код в контроллере:
flash[:error] = I18n.translate 'error.discovered'
Вы можете заглушить 'translate':
it "translates the error message" do
I18n.stub(:translate) { 'error_message' }
get :index # replace with appropriate action/params
flash[:error].should == 'error_message'
end