# 第3章 モデルスペック ## この章の主な流れ - バリデーションをテストする。 - インスタンスメソッドをテストする。 - クラスメソッドとスコープをテストする。 </br> ## テストを書く上でのポイント - 期待する結果は能動形で明示的に記述すること。 - 起きてほしいことと、起きてほしくないことをテストすること。 - 境界値テストをすること。 - 可読性を上げるためにスペックを整理すること。 </br> ## 学び(みなさんの意見もお聞きしたい) - pending機能って便利! - 誤判定ではないことを証明する方法 - FactoryBotを使わずにテストデータ作成する方法 </br> ## 分からなかったこと(みなさんからもあれば) ### ・ページ:53 セットアップの処理を各テストから before ブロックに移動したので、各 ユーザーはインスタンス変数にアサインする必要があります。そうしないとテストの中で変数名を指定してデータにアクセスできないからです。 →before ブロックの中ではインスタンス変数(@hoge)を使う ### **before(:all) vs before(:each)** | | テスト実行後のデータ | 呼び出されるタイミング | 備考 | | ------------- | -------------------- | ---------------------- | ----------------- | | before(:all) |  消えない  |  最初の it のみ | | before(:each) |  消える  | it 毎に呼び出される | each は省略できる | <br/> before(:all)のメリット - 呼び出しが一回だけなのでテストの処理が高速になる - デメリット - データが重複してしまうため各テスト独立したテストができない - テストが終了しても作成されたデーターが残ってしまうため次回以降のテストに影響が出る ```ruby= describe User, "something" do before(:each) do @user = User.new end describe 'ブロックが続いても呼び出される回数は1回だけ'do it "should so something" do @user.first_name = "樋口" p @user end it "should so something else" do p @user end end end ブロックが続いても呼び出される回数は1回だけ #<User id: nil, email: "", created_at: nil, updated_at: nil, first_name: "樋口"... 2回目 #<User id: nil, email: "", created_at: nil, updated_at: nil, first_name: nil... Finished in 0.04551 seconds (files took 3.7 seconds to load) 2 examples, 0 failures it毎に呼び出されるため2回目のitでは@user変数の中身は空になる ``` ```ruby before(:all) do で実行すると... #<User id: nil, email: "", created_at: nil, updated_at: nil, first_name: "樋口"... #<User id: nil, email: "", created_at: nil, updated_at: nil, first_name: "樋口"... ``` ### ・表示言語に依存しないテスト ```ruby expect(note.errors[:message]).to include("can't be blank") ``` テキストでは上記のようにエラーメッセージを英語で記述していますが、表示言語に依存しているので、言語を切り替えるとテストが失敗します。 以下のような記述にすると言語に左右されないので便利です。 ```ruby expect(note.errors).to be_of_kind(:message, :blank) ``` [参考リンク](https://qiita.com/jnchito/items/6cf94a82e719c1dca5f1) </br> ## 議題 ### 1.テストファーストで書いてますか? </br> ### 2.スコープって使ってますか?