FactoryGirl traits are a great way to encapsulate a set of properties into convenient and meaningful names. Using traits effectively is a simple way to drastically improve the expressiveness of your specs.
The 2.0 release of the FactoryGirl RSpec gem includes a major change that now treats traits as first class citizens. When you instantiate a FactoryGirl object instance with traits, the FactoryGirl RSpec gem will now automatically name your local variable to include the traits as part of the variable definition.
describe User do describe '#some_method' do with :user, :without_first_name it 'works as expected' do # notice the variable name includes the trait! user_without_first_name.some_method end end end
Keeping your variable names in sync with the declared factory/traits makes your specs much more expressive. This also means it is now possible to write a spec that relies on multiple instances of the same factory, and each instance can have different traits.
describe User do describe '#some_method' do with :user, :without_first_name with :user, :without_last_name it 'works as expected' do # notice each instance maps to the proper set of traits! user_without_first_name.some_method user_without_last_name.some_method end end end
After using this change, it’s hard to imagine ever going back to a test suite that uses generic variable names for the instantiated factory objects.