Ruby
I18n

I18n.t を使用した文言をテストする場合、 テストコードでは I18n.t を使わないのが良いのでは?

問題提起

次のようなコントローラーの実装とフィーチャーテストがあったとします。僕はテストコードで、 I18n.t を使わない方が良いと思っています。

class ProjectController < ApplicationController
  def index
    -- 省略 --
    redirect_to root_path, alert: "ログインユーザーの#{I18n.t("permit.error_type.#{@error}")}の権限が不足しています。"
  end
end
scenario 'ユーザーが管理者権限を持っていないため、アラートメッセージが表示されること' do
  visit project_paths

  message = "ログインユーザーの#{I18n.t("permit.error_type.#{error}")}の権限が不足しています。"
  expect(page).to have_content(message)
end

理由

I18n.t は、翻訳に失敗した場合 translation missing が発生します。実装とテストコードの両方で I18n.t を使用していると翻訳の失敗に気付けないからです。