【RSpec】バリデーションテストを実装してみた
掲示板アプリで一通りのことを学んだので、12月からRSpecを学び始めました。
RSpec用のsample_appに、これから色々なテストを実装していきます。
掲示板アプリを作成したときと同様、学んだことやエラーの解決方法を順番に備忘録として残していきます。
バリデーションテストで学んだこと
・rails_helperに設定を追加すればFactory_Botの記述を消す事が可能
#spec/rails_hepler内 config.include FactoryBot::Syntax::Methods
・unique属性を持ってるものはsequenceで記述する
#spec/factories/tasks.rb内 FactoryBot.define do factory :task do association :user # associationの記述だけでuserとの紐付けが完了する sequence(:title, "title_1") #unique属性を持ってるものはsequenceで記述する #このようにブロックではない第二引数を渡した場合でも、末尾に.nextが呼ばれて末尾の数字が自動的に増えていく。 content { "count drinks" } status { :todo } # statusなどのenumで別の属性を付与しているものは、文字列ではなくシンボルで記述するとよい。 deadline { 1.week.from_now } # deadlineなどは、時間を決め打ちするのではなく相対表記にする。 # 決め打ちしていると、将来的に過去の時間になってしまう。 end end
・sequence(:title, “title_1”)
といった感じでブロックを渡さずに第二引数を渡すと、 .next が呼ばれる。つまり末尾の数字が増えていく。
・statusなどのenumで別の属性を付与しているものは、文字列ではなくシンボルで記述するとよい。
・deadlineは相対表現にする。時間を決め打ちしてしまうと時間が経った後にテスト結果が変わってしまう。(将来的に過去の日付になってしまう)
・バリデーションテスト時の変数は、一目で何のテスト用かわかるようにする bad: task good: task_without_title
・バリデーションのテストコードは、基本buildでかく。createだとデータベースに保存を試みてしまうので、テスト用の欠陥データがバリデーションに引っかかってテストすらできない。
#spec/models/task_spec.rb内 it 'is invalid with a duplicate title' do task = create(:task) # まずはcreateで最初のデータをデータベースに保存している task_with_duplicate_title = build(:task, title: task.title) expect(task_with_duplicate_title).to be_invalid # be_invalidのテストコードを書かないとエラーが起こる expect(task_with_duplicate_title.errors[:title]).to eq ["has already been taken"] end