1
0
Fork 0
mirror of https://github.com/thoughtbot/factory_bot_rails.git synced 2022-11-09 11:49:18 -05:00
Factory Bot ♥ Rails
Find a file
Daniel Colson 02a0f58487 Allow reloading of factory definitions
Closes #236

This commit uses ActiveSupport's FileUpdateChecker to allow reloading
FactoryBot of definitions whenever a file in
`FactoryBot.definition_file_paths` gets updated.
This is similar to reloading for
[I18n](ced104d579/activesupport/lib/active_support/i18n_railtie.rb (L60-L70))
and [react rails](83b6175460/lib/react/rails/railtie.rb (L35-L41))

This allows us to get rid of any Spring-specific logic in the railtie,
since [Spring hooks into the application
reloader](0c711ff10b/lib/spring/application.rb (L161)).

This partly solves #211, since we no longer call `FactoryBot.reload` at
all in `after_initialize`. Instead, we will only call it when one of the
files in `definition_file_paths` gets updated. I say it partly
solves #211 because once a definition file gets updated, reloading
would still give warnings about redefining any constants in the
definition files. I wonder how common it is to define constants in the
same file as factory definitions. It's probably better to keep constants
in the autoload path, allowing Rails to handle unloading and reloading
them in development. I would want to see some specific examples before
worrying too much about it.

I would also like to offer a better way to configure the definition file
paths (see #165 and #166) and possibly an option to opt out of loading
definitions at all (could help with issues like #192).

A couple of quirks here:
* the to_prepare block could potentially get
[called multiple times](https://github.com/rails/rails/issues/28108).
It shouldn't matter, since `execute_if_updated` is a no-op if no
updates have been made.

* I noticed that the first time I call `reload!` in the console the
factory definitions get reloaded even when I made no updates to the
definition files. I think it is related to
[this](f7c5a8ce26/activesupport/lib/active_support/evented_file_update_checker.rb (L18)). After the first call
`reload!` works as expected, only reloading the factory definitions
if the definition files were updated.

* Rails uses execute rather than execute_if_updated for the
[route
reloader](https://github.com/rails/rails/blob/master/railties/lib/rails/application/finisher.rb#L133)
and for the [watchable file
reloader](https://github.com/rails/rails/blob/master/railties/lib/rails/application/finisher.rb#L173).
This means that changes to factory definitions will cause reloading of
the whole application. I think this is fine.
2018-09-08 02:21:47 +00:00
bin Add bin/setup, improve contributing guidelines 2014-05-27 00:41:28 -07:00
features Update ModelGenerator to generate dynamic attributes 2018-09-03 15:37:26 +00:00
gemfiles Stop testing old Ruby and Rails versions 2018-09-08 01:48:42 +00:00
lib Allow reloading of factory definitions 2018-09-08 02:21:47 +00:00
spec Allow reloading of factory definitions 2018-09-08 02:21:47 +00:00
.gitignore Explicitly define gemfiles for Travis 2014-07-25 16:11:58 -04:00
.rspec Allow reloading of factory definitions 2018-09-08 02:21:47 +00:00
.travis.yml Stop testing old Ruby and Rails versions 2018-09-08 01:48:42 +00:00
Appraisals Stop testing old Ruby and Rails versions 2018-09-08 01:48:42 +00:00
CODE_OF_CONDUCT.md Add standard thoughtbot CODE_OF_CONDUCT.md 2018-09-07 22:16:06 -04:00
CONTRIBUTING.md Rename all girl -> bot 2017-10-20 18:21:52 -04:00
factory_bot_rails.gemspec Bump version to 4.11.1 [ci skip] 2018-09-07 16:48:06 -04:00
Gemfile Rename all girl -> bot 2017-10-20 18:21:52 -04:00
Gemfile.lock Update development dependencies 2018-07-27 10:58:31 -04:00
LICENSE Extend copyright year through 2013 2013-01-04 11:14:31 -05:00
NEWS Bump version to 4.11.1 [ci skip] 2018-09-07 16:48:06 -04:00
Rakefile Allow reloading of factory definitions 2018-09-08 02:21:47 +00:00
README.md Add a "Reviewed by Hound" badge 2018-08-09 18:11:54 -04:00
RELEASING.md Bump version to 4.11.0 [ci skip] 2018-08-16 07:27:22 -04:00

factory_bot_rails 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.

Transitioning from factory_girl_rails?

Check out the guide.

Rails

factory_bot_rails provides Rails integration for factory_bot.

Currently, automatic factory definition loading is the only Rails-specific feature.

Supported Rails versions are listed in Appraisals. Supported Ruby versions are listed in .travis.yml.

Download

Github: http://github.com/thoughtbot/factory_bot_rails

Gem:

$ gem install factory_bot_rails

Configuration

Add factory_bot_rails to your Gemfile:

group :development, :test do
  gem 'factory_bot_rails'
end

Generators for factories will automatically substitute fixture (and maybe any other fixture_replacement you set). If you want to disable this feature, add the following to your application.rb file:

config.generators do |g|
  g.factory_bot false
end

Default factories directory is test/factories, or spec/factories if test_framework generator is set to :rspec; change this behavior with:

config.generators do |g|
  g.factory_bot dir: 'custom/dir/for/factories'
end

If you use factory_bot for fixture replacement, ensure that factory_bot_rails is available in the development group. If it's not, Rails will generate standard .yml files instead of factory files.

factory_bot takes an option suffix: 'some_suffix' to generate factories as modelname_some_suffix.rb.

If you use factory_bot for fixture replacement and already have a factories.rb file in the directory that contains your tests, factory_bot_rails will insert new factory definitions at the top of factories.rb.

You may need to configure your test suite to include factory_bot methods; see configuration.

Contributing

Please see CONTRIBUTING.md.

factory_bot_rails 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_rails 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_rails is maintained and funded by thoughtbot, inc. The names and logos for thoughtbot are trademarks of thoughtbot, inc.

We are passionate about open source software. See our other projects. We are available for hire.