A library for setting up Ruby objects as test data.
Go to file
Daniel Colson d0208eda9c
Default `use_parent_strategy` to true
Background
---

In issues #64 and #66 (from 2010) people expressed surprise
that using the `build` strategy would still `create` any associations.
I remember being similarly surprised by that behavior when I first
started using factory_bot.

The main reason for this behavior is to ensure the built instance will
be valid if there were any foreign key validations
(like `validates_presence_of :user_id`). If we don't save the
associations, there won't be any ids present.

PR #191 (from 2011) offers a workaround for people who don't want
records to be saved automatically. Passing `strategy: :build`
(originally `method: :build`, but later renamed) when declaring the
association will prevent it from being saved when using `build`.

But #191 isn't really a complete solution (as discussed on the PR
after it was merged). `strategy: :build` may do
the right thing when building objects with the `build` strategy, but it
can cause new problems when using the `create` strategy.

A better solution would be something like:
`strategy: <whatever strategy I was already using>`.
PRs #749 and #961 (merged in 2016) introduce something like that,
with the `use_parent_strategy` configuration option.
With this turned on `build` end up being generally [a little faster][]
than `build_stubbed`, since it no longer needs to hit the database for
each association.

[a little faster]: https://gist.github.com/composerinteralia/d4796df9140f431e36f88dfb6fe9733a

I have set `use_parent_strategy` on several projects now. I also added
it to suspenders in thoughtbot/suspenders#952.
On newer projects I have not run into any problems. On existing
projects I have seen the occasional test failure, which are easy enough
to fix by changing `build` to `create`.

Unfortunately I don't think `use_parent_strategy` is widely known,
since it wasn't documented until #1234 (about a month ago).
I also learned in #1234 that the `use_parent_strategy` setting gets
wiped out with `FactoryBot.reload`, which can be problematic when using
factory_bot_rails.

To summarize, we have been exploring having a `build` strategy that uses
`build` all the way down since 2010, but there still isn't a totally
reliable way to get that.

This PR
---

* Default to using the parent strategy for factory_bot 5, as suggested
in #749.
* In the original PR for this (#1240) I had removed
`use_parent_strategy`, but to make the transition smoother I ended up
fixing the reload problem in #1244

Once factory\_bot 5 is released and the dust has settled, it may make
sense to deprecate `use_parent_strategy`, and maybe also the strategy
option for associations.
2019-01-04 19:57:22 -05:00
features Rubocop: Fix Style/StringLiterals Offenses (#1216) 2018-10-07 21:45:51 -04:00
gemfiles Avoid yanked concurrent-ruby version 2018-11-15 08:04:46 -08:00
lib Default `use_parent_strategy` to true 2019-01-04 19:57:22 -05:00
spec Default `use_parent_strategy` to true 2019-01-04 19:57:22 -05:00
.gitignore Add rubocop 2018-09-18 22:58:56 -04:00
.hound.yml Ask Hound to use custom .rubocop.yml 2018-10-07 17:45:13 -04:00
.rspec Remove unnecessary spec_helper requires 2018-05-21 18:03:28 +01:00
.rubocop.yml Arrest lines of an unsavory length 2018-12-12 11:05:13 -05:00
.simplecov Clean up SimpleCov usage 2012-04-23 21:50:39 -05:00
.travis.yml Stop running travis with Rubinius 2018-11-25 23:55:42 -05:00
.yardopts Fix missing docs (#1172) 2018-09-03 13:27:53 +00:00
Appraisals Rubocop: Fix Style/StringLiterals Offenses (#1216) 2018-10-07 21:45:51 -04:00
CODE_OF_CONDUCT.md Add standard thoughtbot CODE_OF_CONDUCT.md 2018-09-07 22:11:26 -04:00
CONTRIBUTING.md Replace 'girl' with 'bot' everywhere (#1051) 2017-10-20 15:20:28 -04:00
GETTING_STARTED.md Default `use_parent_strategy` to true 2019-01-04 19:57:22 -05:00
Gemfile Update Appraisals 2018-10-31 15:35:35 -04:00
Gemfile.lock Avoid yanked concurrent-ruby version 2018-11-15 08:04:46 -08:00
LICENSE Update copyright year 2017-09-28 08:23:29 -04:00
NAME.md Update naming history explanation 2017-10-24 14:17:02 -04:00
NEWS Bump version to 4.11.1 [ci skip] 2018-09-07 15:58:10 -04:00
README.md Remove out-of-date caveat [skip ci] 2018-11-18 19:41:55 -05:00
RELEASING.md Bump version to 4.11 [ci-skip] 2018-08-15 10:56:09 -04:00
Rakefile Update Appraisals 2018-10-31 15:35:35 -04:00
cucumber.yml Fixed issues with some attributes being skipped and added support for linked associations in step definitions 2009-09-15 16:56:20 -04:00
factory_bot.gemspec Rubocop: Fix Style/StringLiterals Offenses (#1216) 2018-10-07 21:45:51 -04:00

README.md

factory_bot Build Status Code Climate Gem Version Reviewed by Hound

factory_bot is a fixtures replacement with a straightforward definition syntax, support for multiple build strategies (saved instances, unsaved instances, attribute hashes, and stubbed objects), and support for multiple factories for the same class (user, admin_user, and so on), including factory inheritance.

If you want to use factory_bot with Rails, see factory_bot_rails.

Interested in the history of the project name?

Transitioning from factory_girl?

Check out the guide.

Documentation

You should find the documentation for your version of factory_bot on Rubygems.

See GETTING_STARTED for information on defining and using factories. We also have a detailed introductory video, available for free on Upcase.

Install

Add the following line to Gemfile:

gem 'factory_bot'

and run bundle install from your shell.

To install the gem manually from your shell, run:

gem install factory_bot

Supported Ruby versions

The factory_bot 5.x series supports MRI Ruby 2.3+.

The factory_bot 3.x+ series supports MRI Ruby 1.9. Additionally, factory_bot 3.6+ supports JRuby 1.6.7.2+ while running in 1.9 mode. See GETTING_STARTED for more information on configuring the JRuby environment.

For versions of Ruby prior to 1.9, please use factory_bot 2.x.

More Information

You may also find useful information under the factory_girl tag on Stack Overflow.

Contributing

Please see CONTRIBUTING.md.

factory_bot was originally written by Joe Ferris and is now maintained by Josh Clayton. Many improvements and bugfixes were contributed by the open source community.

License

factory_bot is Copyright © 2008-2016 Joe Ferris and thoughtbot. It is free software, and may be redistributed under the terms specified in the LICENSE file.

About thoughtbot

thoughtbot

factory_bot is maintained and funded by thoughtbot, inc. The names and logos for thoughtbot are trademarks of thoughtbot, inc.

We love open source software! See our other projects or hire us to design, develop, and grow your product.