プログラミング学習 備忘録

Railsを学習していく上での技術メモ。学んだことや解決したエラーなどを記録していきます。

【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