factorybotでrailsのテストデータを用意する

3 min 224 views
muraoka

muraoka

pixiv、nanaでプロダクトマネージャーを経験。
現在はマーケティングやwebサービス開発のコンサルティングを行っています。

FOLLOW

railsでfactorybot+rspecでテスト用のデータを簡単に用意する方法をfactorybotの導入からデータの定義まで解説していきます。プログラミング初心者向けにわかりやすく解説していきます。

この記事の目的

rails+rsepc+factorybotでテスト用のデータを簡単に用意する

factorybotの導入

gem導入

group :development, :test do
   gem 'factory_bot_rails'
end

factoryfileの作成

rails g factory_bot:model モデル名

上記コマンドでfactoryファイルを作成。test/factoriesに作成される

データの用意の仕方

上記で作ったファイルに下記で定義していく。今回はuserモデルで人を何パターンか作成する。

FactoryBot.define do 
  factory :user do
    first_name "name"
    last_name "last_name"
    email "test@example.com"
    password "password"
  end
end

これを下記でテスト時に定義

describe User do
  it "is valid" do
    expect(FactoryBot.build(:user)).to be_valid 
  end
end

buildとcreateの違いは大まかに言うとDBに保存するかどうか

build

  • メモリ上にインスタンスを確保する。
  • DB上にはデータがないので、DBにアクセスする必要があるテストのときは使えない。
  • idや作成日時はnilになる

create

  • DB上にインスタンスを永続化する。
  • DB上にデータを作成する。
  • DBにアクセスする処理のときは必須。(何かの処理の後、DBの値が変更されたのを確認する際は必要)

同じモデルのデータを複数用意

同じモデルのデータを複数用意したい場合は、いくつか方法があります。

  • 単純にテスト時に複数回作成する。この場合、同じデータに
  • traitなどで継承させて複数のデータを違うデータ部分だけかく
  • create_listで繰返しの回数を指定して作成する

traitで継承させて作成

traitで下記で定義し、

FactoryBot.define do 
  factory :person do
    name "taro"
    gender "male"
 
    trait :person_01 do
      name "jirou"
    end

    trait :person_02 do
      name "hanako"
      gender "female"
    end
  end
end

下記で呼び出す

FactoryBot.create(:親元のキー, :traitを定義したキー)
describe "person" do
  it "person_01" do
    project = FactoryBot.create(:person, :person_01)
  end
 
  it "person_02" do
    project = FactoryBot.create(:person, :person_02)
  end
end

traitなしで継承させる場合

traitがない場合、下記になります。

FactoryBot.define do 
  factory :person do
    name "taro"
    gender "male"
 
    factory :person_01 do
      name "jirou"
    end

    factory :person_02 do
      name "hanako"
      gender "female"
    end
  end
end

呼び出し方法は継承しないで大元を呼び出す際と変わらない

describe User do
  it "person_02" do
    expect(FactoryBot.build(:person_02)).to be_valid 
  end
end

create_listで繰返しの回数を指定して作成する

create_listの場合、下記

FactoryBot.define do 
  factory :user do
    first_name "name"
    last_name "last_name"
    email "test@example.com"
    password "password"
  end
end

定義は上記で変わらず、

describe User do
  it "person5人" do
    persons = create_list(:person, 5)
  end
end

これで5人作成

関連記事