Factory_bot_rails 筆記

在 factory_bot_rails 裡面 Callbacks 分為四種 順序依序為:after(:build) -> before(:create) -> after(:create) 另外 after(:stub) #在 build_stubbed 建立物件時使用


而在使用 factory_bot 建立物件時,常常會用到 build(:user)、create(:user)、build_stubbed(:user),這三種的差異是?

build(:user)、create(:user)、build_stubbed(:user) 差異

  • build(:user) 不會將物件存進資料庫中、且觸發驗證與關聯

  • create(:user) 會將物件存進資料庫、且觸發驗證與關聯

  • build_stubbed(:user) 不會將物件存進資料庫中、不會觸發關聯性物件的驗證,而且會提供一個假 id、假 created_at


fatory_bot_rails 使用情況

基本用法為

factory :user do
  name { "Friendly User" }

  trait :male do
    name { "John Doe" }
    gender { "Male" }
  end
end
create(:user) #建立 user 物件
create(:user, :male) #建立 user 並帶入 male 的設定

想在建立使用者時順便建立起相關聯的 factory 的話

factory :user do
  #some attributes
  after :create do |user|
    create :profile, user: user             # has_one
    create_list :article, 3, user: user     # has_many :article * 3
  end
end

想在建立 profile 時順便建立使用者的話

factory :profile do
  user #這是 association :user, factory: :user 的縮寫
  association :user, factory: [:user, :sometrait]  #也可以指定 factory
end

如果想一次建立多個 factory

factory :article do
  title { "A title" }

  factory :approved_post do
    approved { true }
  end
end

approved_post = create(:approved_post)
approved_post.title    # => "A title"
approved_post.approved # => true

不想寫在裡面的話也可以這樣寫

factory :post do
  title { "A title" }
end
factory :approved_post, parent: :post do
  approved { true }
end

想在建立使用者時順便建立起相關聯的 factory且要不同 trait 的話?

#memberships.rb
factory :pay_at_2018, parent: :membership, traits: [:pay2018]
factory :pay_at_2019, parent: :membership, traits: [:pay2019]
factory :pay_at_2020, parent: :membership, traits: [:pay2020]
#users.rb
after(:create) do |user|
  create(:pay_at_2018, user: user)
  create(:pay_at_2019, user: user)
  create(:pay_at_2020, user: user)
end

參考文獻