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

引き続き学んでいきます。