■
お疲れ様です!
では今日はテストコードの手順的なのを作業でやった順番で記述していこうと思います!
まずitでグループ分けされた中に個別で記載していきます。
一旦ここまで記述したらテストコードを実行します。グループ分けした状態でも実行は可能。実行するときは、bundle execコマンドに続けて、rspecコマンドを入力してファイルを指定後に実行します。
確認後実際に内容を記述していきます。
例えばnicknameが空だと保存できないというテストコードの場合
nicknameの値が空のインスタンスを生成します。
この後、正常に機能するか検証するため、バリデーションを実行します。ただ、バリデーションは実際にデータが保存される前しか実行されないのでvalid?を使用して任意のタイミングで実行させてエラーがあるかを判断させます。
先程生成したインスタンスに対してバリデーションを実行するように記述します。
上記のような「想定した挙動」と「アプリの実際の挙動」を確認します。
この確認をテストコードに落とし込んだものをexpectationといい、expect().to matcher()を雛形に、テストの内容に応じて引数やmatcherを変えて記述します。
今回はexpectの引数にuser.errors.full_messagesと記述し、インスタンスのエラーメッセージを指定し、includeの引数には想定するエラーメッセージを記述を適切に行いました。
ここでテストコードを実行して成功すれば完了です。
この後の流れは大体一緒でitにそれぞれのテストコードを記述していきます。
以上が最初に学習した時の内容です。
その後何回か練習をした後に効率的にコードを書くためにGemを導入しました。
まず最初にFactoryBotを導入しました。
これはインスタンスをまとめることができるGemで、別のファイルであらかじめ各クラスのインスタンスに定める値を設定しておき各テストコードで使用できると言ったものです。
実際にユーザーの情報を保存する場合は様々な情報があるので毎回コードを書くとかなり冗長になり、また可読性も落ちます。
導入後他のテストコードもかなり記述を短縮できたので見やすく感じました。
また、共通した記述も可読性にかけてしまうので切り出しました。
beforeを使用してインスタンス変数に保存情報を格納数ことでかなりスッキリします。
次に、FactoryBotで設定した値は固定されてしまうのでメールアドレスなど一意性のあるものに関しては別の値を使用したいのでランダムに値を生成してくれるFakerというGemを導入しました。
様々な意図に応じたランダムな値を生成してくれます。
実際にはFactoryBotで作成したファイルに記述していきます。
これでテストコードはかなり効率化されたかと思います。
初めてテストコード記述する時にまず、イグザンプルの洗い出しに時間がかかったなと感じました。
これはプログラミング言語を始めてよく思うことですが技術も必要だけど問題や課題の洗い出しことや考える力もとても重要だなと感じました。
特に要件定義などやったときは何があればいいんだろうとか色々考えていたのでこれからはそういった能力もレベルアップできるように読書や情報収集などできることは継続していきたいなと思います!!
ではまた!