【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メソッドの使い方

※間違いなどあればコメントください!