While I’m still not entirely sold on FactoryGirl, I often see it being used in a particularly lazy way. Imagine your basic factory:
Before long you’re adding relations to projects, and the first thing people do is this:
factory :project do association :user end
This immediately means that every single time you instantiate a project, you’re getting a user as well. In most cases this is more than you want, and if you continue to follow down this path you end up with a huge slow test suite. I prefer a slightly different strategy: start small and compose.
factory :project do ... end trait :with_manager do association :user, factory: :manager end
This defines a very simple factory :project which gives you only a project and allows you to build a project with an associated user like so:
The result is a couple more arguments when you use the factory, but the overall code is more intention revealing.
If this is too much, you could always create a more descriptive factory:
factory :managed_project, parent: :project, traits: [:with_manager]
If you stick with this strategy, you’ll find that tests are more concise, factories are more useful and your test suite run time won’t grow as fast.
About the Author
BiographyMore Content by John Barker