The Factory Girl introduction delineates the difference between FactoryGirl.build()
and FactoryGirl.create()
:
# Returns a User instance that's not saved user = FactoryGirl.build(:user) # Returns a saved User instance user = FactoryGirl.create(:user)
I still doesn't understand the practical differences between the two. Can someone give an example where you would want to use one and not the other? Thanks!
Factory Bot is often used in testing Ruby on Rails applications; where it replaces Rails' built-in fixture mechanism. Rails' default setup uses a pre-populated database as test fixtures, which are global for the complete test suite.
Factory Bot is a helper for writing factories for Ruby tests. It was previously known as Factory Girl.
build_stubbed is the younger, more hip sibling to build ; it instantiates and assigns attributes just like build , but that's where the similarities end.
The create()
method persists the instance of the model while the build()
method keeps it only on memory.
Personally, I use the create()
method only when persistence is really necessary since writing to DB makes testing time consuming.
e.g.
I create users to authentication with create()
because my authentication engine queries the DB.
To check if a model has an attribute the build()
method will do because no DB access is required.
it{Factory.build(:user).should respond_to(:name)}
"There is one exception that build actually 'creates' when you are building associations, i.e your association are no longer in memory but persisted. Keep that in mind" – Shakes
Using FactoryGirl.build(:factory_name)
does not persist to the db and does not call save!
, so your Active Record validations will not run. This is much faster, but validations might be important.
Using FactoryGirl.create(:factory_name)
will persist to the db and will call Active Record validations. This is obviously slower but can catch validation errors (if you care about them in your tests).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With