web-dev-qa-db-ja.com

I18n変換をrspecテストに追加する

仕様に翻訳テストを追加するにはどうすればよいですか?何かのようなもの :

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

もちろん、これは機能しません。それを機能させる方法は?

特定のエラーが返されることを確認します。

27
Spyros

私のコードでは、rspec2を使用するRails3プロジェクトです。これはまさに私が書く行です。

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

だから、なぜそれが不可能だと言うのか分かりませんか?

65
nathanvda

これが最適かどうかはわかりませんが、私の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
_

_I18n.t_を使用せずにt()メソッドだけを仕様で使用できるようにする方法がわからなかったので、仕様に小さな便利なメソッドを追加しました/support/utilities.rb

_def t(string, options={})
  I18n.t(string, options)
end
_

更新:最近、私は i18n-tasks gemを使用してi18nに関連するテストを処理する傾向があり、私が書いたものではありません上記またはStackOverflowで以前に回答したことがあります。

私はRSpecテストでi18nを使用して、主にすべての翻訳があることを確認したいと考えていました。 i18n-tasksは、コードの静的分析を通じてそれ以上のことを実行できるため、すべての_I18n.available_locales_のテストを実行する必要はありません(たとえば、非常にロケール固有の機能をテストするときを除き、システム内の他のロケールへの任意のロケール)。

これを行うことで、繰り返しテストの数を減らし、その結果スイートの実行時間を短縮しながら、システム内のすべてのi18nキーが実際に値を持っていることを確認できます(未使用または廃止されたものはありません)。

13
Paul Fioravanti

コントローラのコードが次のようであると仮定します:

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
4
zetetic