- 更新日: 2014年2月26日
- RSpec
Rails で i18n 化に RSpec + Capybara のテストを対応させる
i18n 化とともに、RSpec + Capybara で書いているテストを、多言語化に対応させるように改修中なのですがなかなか面倒くさい。
— 環境 —
rails-4.0.1
rspec-rails-2.14.0
capybara-2.2.0
RSpec テスト中で I18n.t メソッドを使う
ビューファイルは辞書ファイル(config/locales/**/ja.yml など)へのキーで置き換わるので、当然ながら以下のようにビューファイルの表示文字を直書きしていたテストは通らなくなります。
1 |
it { should have_title( "Sign in" ) } |
i18n 化とともに、以下のように変更しなければならない。
1 |
it { should have_title( I18n.t('users.sessions.new.title') ) } |
実装に依存する部分は、最初の describe の冒頭の before で、変数に割り当てておいたほうが良いかもしれません。
1 2 3 4 5 6 7 8 |
describe "User session pages authentication" do before do @title = I18n.t("users.sessions.new.title") ... end ... |
サポート用の t メソッドを作成
あとは、毎回 I18n.t と書くのが面倒くさいので、spec/support/utilities.rb に以下のメソッドを作りました。ちょっとでも楽するためにやったのはせいぜいこれくらい。
spec/support/utilities.rb
1 2 3 |
def t(key, options={}) I18n.t(key, options) end |
これで spec 内で、I18n.t → t と書けるので少しタイプ文字が減ります。
【追記 2014/02/27】
当初、t_s メソッドという名前で作成していましたが、t メソッドに変更しました。これでビューで呼ぶのと同じ形式。spec 以下ディレクトリでは、I18n.t としないと t メソッドを使えないため、これはオーバーライドにはならない。
実際のテストコードの例
spec/requests/user_session_pages_spec.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
describe "User session pages authentication" do before do @title = t("users.sessions.new.title") end subject { page } describe "signin page" do before { visit new_user_session_path } it { should have_title(@title) } end describe "signin" do before { visit new_user_session_path } describe "with invalid information" do before { click_button @title } ... |
一応これで、テストは通るようになるのですが、正直あまりいけてない臭がぷんぷんします。i18n 利用時の RSpec のベストプラクティスをご存知の方がおられましたら、ぜひ教えて下さい!
- RSpec の関連記事
- FactoryGirlをSpringと共に使う時の注意
- 複数モデルのpost :createをテストするRSpecコード(Controller Spec)
- RSpec3でTime.nowをスタブ化(stub)
- RSpecでJSONによるPOSTリクエストをテスト
- RSpec & Capybara の雑感
- RSpec+Capybaraで同名の複数要素の並び順をテストする
- RSpec3ではrails_helper.rbがrequireされる
- Capybara + Launchy で RSpec テストをブラウザで確認
- CapybaraのwithinをRSpecで使う
- Serverspec(RSpec)のテスト出力に色を付けて見やすくフォーマット
Leave Your Message!