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

目次

マーケター、エンジニアを月1時間からジョインできるプラットフォーム

airteamは月1時間からマーケターやエンジニアに相談できるプラットフォーム。 雇うのはハードル高いけどプロをチームに入れたい。そんな経営者のためのサービスです。 相談にのる方も募集しています。

タスクなしだから月一時間からジョイン可能

作業はなくオンライン相談メイン。 月1時間からさっと経験者に継続的に相談できます。

多様な経験者を雇用するより何倍も早くチームに

あらゆるジャンルの経験者がいるので あなたのチームのノウハウの選択肢が広がります。

NDAはすでに締結済み、契約もスムーズ

契約の煩雑なやりとりはなく、NDAはすでに締結済み、書面のやりとりはありません。

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人作成