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