環境
Ruby 2.5.0
RSpec 3.7.1
Rails 5.2.0
気づいたらFactoryGirlがFactoryBotになっていた。
参考:https://qiita.com/jnchito/items/c71b8f66f61214227555
まあそれはそれとして、大きめなModelのFactoryを作っていると
1つのModelがだんだんと肥大化・難読化していくもの。
これを整理するためにtraitを使うことは効果的な選択肢である。
1 2 3 4 5 6 7 8 9 10 11 12 |
FactoryBot.define do factory :book do name 'samplebook' price 1500 publisher 'sample publisher' trait :is_discounted do is_discounted true price 1000 end end end |
1 2 |
book = create(:book) discounted_book = create(:book, :is_discounted) |
traitは上記のようにModel自身のパラメータをパターン分けするために使われることが多いようだが
afterコールバックと組み合わせてhas_manyなどの関連モデルを動的に変えることもできる。
1 2 3 4 5 6 7 8 9 |
FactoryBot.define do factory :stock_japan do locale 'ja' end factory :stock_us do locale 'us' end end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
FactoryBot.define do factory :book do name 'samplebook' price 1500 publisher 'sample publisher' trait :is_discounted do is_discounted true price 1000 end # 在庫(stock)のうち、日本の在庫と結合 trait :stock_japan do after(:build) do |book| book.stocks << FactoryBot.build(:stock_japan) end end # 在庫(stock)のうち、アメリカの在庫と結合 trait :stock_us do after(:build) do |book| book.stocks << FactoryBot.build(:stock_us) end end end end |
1 2 3 4 |
book = create(:book) discounted_book = create(:book, :is_discounted) japan_discounted_book = create(:book, :is_discounted, :stock_japan) us_discounted_book = create(:book, :is_discounted, :stock_us) |
関連テーブルもtraitで差分実装できるととてもスッキリして良い。