| title | Factory Bot | ||||
|---|---|---|---|---|---|
| category | Ruby libraries | ||||
| layout | 2017/sheet | ||||
| weight | -3 | ||||
| updated | 2020-07-06 | ||||
| keywords |
|
||||
| tags |
|
{: .-three-column}
{: .-intro}
Factory Bot is a helper for writing factories for Ruby tests. It was previously known as Factory Girl. For older versions, use FactoryGirl instead of FactoryBot.
- Factory Bot documentation (rubydoc.info)
- Getting started (github.com)
- Source code (github.com)
FactoryBot.define do
factory :user do
first_name { 'John' }
last_name { 'Doe' }
birthdate { 21.years.ago }
admin { false }
sequence(:username) { |n| "user#{n}" }
end
end{: data-line="2"}
See: Defining factories
factory :user, class: 'User' do
···
endfactory :user, aliases: [:author] do
···
endFactoryBot.build(:user)build(:user) # → model (not saved)
create(:user) # → model (saved)
attributes_for(:user) # → hash
build_stubbed(:user) # stubbed out attributesbuild(:user, name: 'John')create_list(:user, 3)
build_list(:user, 3)factory :post do
association :author, factory: :user
association :author, factory: [:user, :admin]
end{: data-line="2,3"}
factory :post do
author # assumes there's a factory :author
endfactory :post do
after :create do |post|
create :theme, post: post # has_one
create_list :comment, 3, post: post # has_many
end
end{: data-line="2"}
{: .-three-column}
factory :user do
trait :admin do
admin { true }
end
end{: data-line="2,3,4"}
create :user, :adminTraits allow you to group attributes together. See: Traits
factory :user do
first_name { 'John' }
factory :sample_user do
first_name { FFaker::Name.first_name }
end
end{: data-line="4,5,6"}
create :sample_userSee: Inheritance
factory :user do
···
endfactory :sample_user, parent: :user do
first_name { FFaker::Name.first_name }
end{: data-line="1"}
create :sample_userWorks the same as nested factories.
factory :user do
transient do
upcased { true }
end
after :create do |user, options|
user.name.upcase! if options.upcased
end
end{: data-line="2,3,4"}
create(user, upcased: true)Transient attributes will not get passed to the model, but will be available in after-create hooks. See: Transient attributes
- test/factories.rb
- spec/factories.rb
- test/factories/*.rb
- spec/factories/*.rb
Place your factories in these locations. {: .-setup}
{: .-one-column}