RSpecを勉強していてモデルのバリデーションのテストを検証する際、以下のようにエラーメッセージを含んでいるかどうかでテストを行なっていた。
it 'is invalid without a title' do
post = create(:post, title: nil)
post.valid?
expect(post.errors[:title]).to include("can't be blank")
end
しかし、国際化に対応した時、英語だけではなく日本語や他の言語の時もテストしたい場合どうなんだろうと思った。
そこで調べていたところ、このエラーメッセージに対応するキーが存在するかどうかのマッチャーがRails6から導入されていたらしい!
どのフィールドにどの検証エラーが追加されたのかを、「表示言語やエラーメッセージに依存しない形で」テストする方法
これによって、次のようなテストを書くことができる。
it 'is invalid without a title' do
post = create(:post, title: nil)
post.valid?
expect(post.errors).to be_of_kind(:title, :blank)
end
こっちの方が個人的には好み〜
また、バリデーションエラーメッセージに対応するキーについてはこちらにリストアップされていた。
Railsガイド
ちなみに、#of_kind?
メソッドについて調べてみたところ第2匹数にはキーだけでなくエラーメッセージを渡すこともできる。
API doc