rails

【Rails】Rspecでvalidationのテストコードを書く!-後半

前回のこちらの記事の続きです。

【Rails】Rspecでvalidationのテストをしよう!-準備編

前回の記事ではRspecを書くための準備として解説してきましたが、これからfactory_girlのインスタンスを生成するためのコードと実際のバリデーションを調べるためのテストコードを書きます!

factory_girlを使ってインスタンス生成するためのコードを書く

実際に書いたのはこんな感じです。

これで、ダミーのnema,email,password,password_confirmationのインスタンスを生成することができるので、テストコードを短くすることができます。

それではRspecをuser_spec.rbに書いていきます!

モデルクラスのテストコードを書いてみよう!

完成したコードはこちらで、ターミナルにbundle exec rspecとコマンドを打ち込むことで確かめることができます。

英語ばかりでわかりにくいかもしれませんが、今回は上記全てに関して解説すると記述がかなり多くなってしまうので、下の3つをピックアップして解説します!

・nameとemail、passwordとpassword_confirmationが存在すれば登録できること
・nameが空では登録できないこと
・nameが11文字以上であれば登録できないこと

最初にrequireでrails_helper.rbのファイルを読み込み、describe以下に記述。

describeとdoの間にメソッド記述する際は#を書くのが慣習です。

buildメソッド

buildメソッドはfactory_girlにおけるメソッドです。引数にシンボル型のクラスとname:””というキーと値を入れると、先程factories/user.rbで記述したインスタンスのnameを上書きすることができます。

valid?メソッド

このメソッドでバリデーションで保存できない状態であるかを確かめることができます。

errorsメソッド

valid?メソッドの返り値true/falseに対してerrorsメソッドを使用すると、バリデーションで保存できない状態である場合になぜできないのかを確認することができます。

includeマッチャ

includeの引数にとった値が、expectの引数にとった配列に含まれているかどうかを確認することができます。

今回は‘rails-i18n’というgemを導入してエラー文を日本語にしています。

be_validマッチャ

expectの引数にしたインスタンスが全てのバリデーションをクリアする場合にパスするバリデーションです。

これでname,email,password,password_confirmの全てがちゃんと登録できるか確認することができます。

これらのメソッドやマッチャを組み合わせてRspecで記述します。

あとはターミナルでbundle exec rspecというコマンドを打つと

このようにit以下に記述したものクリアした場合に表示され、0 failuresとなります。

もし仮にRspecの記述を一つ間違えると、1 failuresとなってしまいますが、どこが間違えているのかエラー文が出るために確認することが出来ます。

例えば、includeの引数の中を間違えたりすると、

このように“は10文字以内で入力してください”というのが本来でるエラー文のはずが、“11文字”にしてしまったためfailureになりました。

わかりやすいですね!

これでvalidationのテストが一通り出来たかと思います!

まとめ

・validationのテストコードはメソッドやマッチャを理解して入れば記述はなんとなく似ているので結構簡単にできる!

・テストするはずなのにテストコードの記述を間違えてしまうことが結構ある。(自分だけ?)

・今度はCapybaraを使用して、E2Eテスト方法をまとめます!

人生が変わるTECH::EXPERTを受講生が徹底取材!

詳細ページに行く