Добавить переводы I18n в тесты rspec - PullRequest
26 голосов
/ 24 марта 2011

Как я могу добавить тест на перевод в мои спецификации?Что-то вроде:

flash[:error].should == I18n.translate 'error.discovered'

это не работает, конечно.Как заставить это работать?

Я хочу убедиться, что получаю определенную ошибку обратно.

Ответы [ 3 ]

65 голосов
/ 27 марта 2011

В моем коде проект 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

Так что я не уверен, почему вы говорите, что это невозможно?

13 голосов
/ 20 мая 2012

Не уверен, что это оптимально, но в моих приложениях 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 в системе действительно имеют значения (и что ни один из них не используется или устарел), сохраняя при этом количество повторяющихся тестов,и, следовательно, время выполнения сюиты уменьшилось.

3 голосов
/ 27 марта 2011

Предполагая, что код в контроллере:

flash[:error] = I18n.translate 'error.discovered'

Вы можете заглушки "перевести":

it "translates the error message" do
  I18n.stub(:translate) { 'error_message' }
  get :index # replace with appropriate action/params
  flash[:error].should == 'error_message'
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...