【FactoryBot】create_listで複数のインスタンスの配列を作成する【RSpec】
はじめに
先日、RSpecでテストを書いていた際に、テストデータをまとめて作成したいなーと思って調べたので、ご参考になれば。
create_listメソッドとは
create_listメソッドとは、ファクトリに定義しているテストデータを、配列としてまとめて取得することができます。
使い方
FactoryBot.define do factory :task do sequence(:title, "title_1") content { "content" } status { :todo } deadline { 1.week.from_now } association :user end end
ファクトリに上記のような定義がある場合、
例えば、3つのtaskインスタンスの入ったテストデータがほしいとき、下記のように定義することで取得できます。
tasks = create_list(:task, 3) #変数tasksに3つのtaskインスタンスの配列が入っている
また、明示的に値を渡したりトレイトを使うことで、特定のカラムを上書きすることもできます。
tasks = create_list(:task, 3, :doing, title: 'overwrite_title') # :doingはtrait、titleは上書き
つまり、抽象化するとこんな感じです↓
create_list(<ファクトリ名>, <インスタンスの数>, <traitや上書きしたい項目>)
#戻り値は配列
実際に使ってみた
create_listを実際に使った時のテストコードはこんな感じでした↓
it 'is success to transition to task list page' do tasks = create_list(:task, 3) visit tasks_path expect(page).to have_content tasks[0].title expect(page).to have_content tasks[1].title expect(page).to have_content tasks[2].title expect(current_path).to eq tasks_path end
一部ですが、task一覧ページへの遷移がうまくいっていることを確認するためのテストです。
1行目でtaskインスタンスが3つ入った配列を取得したあと、task一覧ページに遷移しています。
そして、変数tasksのインデックス番号を使って、作成した3つのtaskインスタンスのタイトルが一覧ページに含まれているかを確認しています。
参考
factory_bot - create_listメソッドの使い方
※間違いなどあればコメントください!