FactoryBotでtraitを使ってアソシエーション先のデータも作る
FactoryBotでアソシエーションが絡んだデータの事が今ひとつ理解できておりませんw
今日はtraitを使ってアソシエーション先のテストデータも作るということを覚えました。
そのやり方についてです。
ファクトリーを設定
通常のFactoryBotを用いたデータ生成の設定に加え、
trait ~ do ~ endのブロックで関連先のデータについても設定してあげます。
ブロックの中には以下のように、after(~) do |~| ~ endとさらにブロックを渡し、
データがbuildされたら呼ばれるようにしてあげます。
spec/factories/users_spec.rb
FactoryBot.define do
factory :house do
sequence(:address) { |n| "address_#{n}" }
sequence(:tel_number) { |n| "000-0000-00#{n}" }
trait :with_user do
after(:build) do |restaurant|
restaurant.restaurant_user = FactoryBot.create(:restaurant_user)
end
end
end
end
設定したファクトリーを使う
設定したファクトリーを使う際は、以下のようにcreate (以下の例ではcreate_list) の引数に、そのtraitも指定します。
すると、traitで定義したアソシエーション先を持ったテストデータが生成されます!
spec/system/xxxx/oooo/users_spec.rb
require 'rails_helper'
RSpec.describe 'xxxxxx', type: :system do
describe 'oooooo' do
let!(:houses) { FactoryBot.create_list(:restaurant, 25, :with_user) }
略
end
end
traitを指定しなければ関連先は作らないで済みますし、
traitを何個も作って使い分けることもできるようです。
感想
奥が深くてまだまだ未知な部分が多いですw
引き続き学んでいきます。