Try   HackMD

第3章 モデルスペック

この章の主な流れ

  • バリデーションをテストする。
  • インスタンスメソッドをテストする。
  • クラスメソッドとスコープをテストする。

テストを書く上でのポイント

  • 期待する結果は能動形で明示的に記述すること。
  • 起きてほしいことと、起きてほしくないことをテストすること。
  • 境界値テストをすること。
  • 可読性を上げるためにスペックを整理すること。

学び(みなさんの意見もお聞きしたい)

  • pending機能って便利!
  • 誤判定ではないことを証明する方法
  • FactoryBotを使わずにテストデータ作成する方法

分からなかったこと(みなさんからもあれば)

・ページ:53

セットアップの処理を各テストから before ブロックに移動したので、各 ユーザーはインスタンス変数にアサインする必要があります。そうしないとテストの中で変数名を指定してデータにアクセスできないからです。

→before ブロックの中ではインスタンス変数(@hoge)を使う

before(:all) vs before(:each)

テスト実行後のデータ 呼び出されるタイミング 備考
before(:all) 消えない 最初の it のみ
before(:each) 消える it 毎に呼び出される each は省略できる

before(:all)のメリット

  • 呼び出しが一回だけなのでテストの処理が高速になる

  • デメリット

    • データが重複してしまうため各テスト独立したテストができない
    • テストが終了しても作成されたデーターが残ってしまうため次回以降のテストに影響が出る
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変数の中身は空になる
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: "樋口"...

・表示言語に依存しないテスト

expect(note.errors[:message]).to include("can't be blank")

テキストでは上記のようにエラーメッセージを英語で記述していますが、表示言語に依存しているので、言語を切り替えるとテストが失敗します。

以下のような記述にすると言語に左右されないので便利です。

expect(note.errors).to be_of_kind(:message, :blank)

参考リンク


議題

1.テストファーストで書いてますか?


2.スコープって使ってますか?