diff --git a/factory_girl.md b/factory_girl.md index 7b077f75a..129c53592 100644 --- a/factory_girl.md +++ b/factory_girl.md @@ -1,103 +1,198 @@ --- -title: FactoryGirl +title: Factory Girl category: Ruby libraries -layout: default-ad +layout: 2017/sheet +weight: -3 +updated: 2017-09-01 --- ## Factories +{: .-three-column} - FactoryGirl.define do - factory :user do - first_name 'John' - last_name 'Doe' - birthdate { 21.years.ago } - admin false +### Defining factories - sequence(:username) { |n| "user#{n}" } - end - end +```ruby +FactoryGirl.define do + factory :user do + first_name 'John' + last_name 'Doe' + birthdate { 21.years.ago } + admin false - # Also available: - factory :user, class: 'User' - factory :user, aliases: [:author] + sequence(:username) { |n| "user#{n}" } + end +end +``` +{: data-line="2"} -## Using +See: [Defining factories](http://www.rubydoc.info/gems/factory_girl/file/GETTING_STARTED.md#Defining_factories) - FactoryGirl.build(:user) +### Extra options - build(:user) # not saved - create(:user) # saved - attributes_for(:user) # hash - build_stubbed(:user) # stubbed out attributes +```ruby +# Custom class names +factory :user, class: 'User' do + ··· +end +``` - build(:user, name: 'John') +```ruby +# Aliases +factory :user, aliases: [:author] do + ··· +end +``` - create_list(:user, 3) - build_list(:user, 3) +### Using + +```ruby +FactoryGirl.build(:user) +``` + +```ruby +build(:user) # not saved +create(:user) # saved +attributes_for(:user) # hash +build_stubbed(:user) # stubbed out attributes +``` + +```ruby +# With options: +build(:user, name: 'John') +``` + +```ruby +# List: +create_list(:user, 3) +build_list(:user, 3) +``` ## Associations - factory :post do - association :author, factory: :user - association :author, factory: [:user, :admin] +### Defining - author # assumes there's a factory :author - end +```ruby +factory :post do + association :author, factory: :user + association :author, factory: [:user, :admin] +end +``` +{: data-line="2,3"} + +or: + +```ruby +factory :post do + author # assumes there's a factory :author +end +``` ### After-create hooks - factory :post do - after :create do |post| - create :theme, post: post # has_one - create_list :comment, 3, post: post # has_many - end - end +```ruby +factory :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"} -## Traits +## Other features +{: .-three-column} - factory :user do - trait :admin do - admin true - end - end +### Traits - create :user, :admin +```ruby +factory :user do + trait :admin do + admin true + end +end +``` +{: data-line="2,3,4"} -## Nested factories +```ruby +create :user, :admin +``` - factory :user do - first_name 'John' +Traits allow you to group attributes together. +See: [Traits](http://www.rubydoc.info/gems/factory_girl/file/GETTING_STARTED.md#Traits) - factory :sample_user do - first_name { FFaker::Name.first_name } - end - end +### Nested factories - # create :sample_user +```ruby +factory :user do + first_name 'John' - # Also: factory :sample_user, parent: :user + factory :sample_user do + first_name { FFaker::Name.first_name } + end +end +``` +{: data-line="4,5,6"} -## Options (transients) +```ruby +create :sample_user +``` - factory :user do - transient do - upcased true - end +See: [Inheritance](http://www.rubydoc.info/gems/factory_girl/file/GETTING_STARTED.md#Inheritance) - after :create do |user, options| - user.name.upcase! if options.upcased - end - end +### Sub-factories - create(user, upcased: true) +```ruby +factory :user do + ··· +end +``` -## Paths +```ruby +factory :sample_user, parent: :user do + first_name { FFaker::Name.first_name } +end +``` +{: data-line="1"} - test/factories.rb - spec/factories.rb - test/factories/*.rb - spec/factories/*.rb +```ruby +create :sample_user +``` + +Works the same as nested factories. + +### Options (transients) + +```ruby +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"} + +```ruby +create(user, upcased: true) +``` + +Transient attributes will not get passed to the model, but will be available in after-create hooks. +See: [Transient attributes](http://www.rubydoc.info/gems/factory_girl/file/GETTING_STARTED.md#Transient_Attributes) + +### Paths + +* test/factories.rb +* spec/factories.rb +* test/factories/*.rb +* spec/factories/*.rb + +Place your factories in these locations. +{: .-setup} ## See also +{: .-one-column} *