Using factory_bot with custom factories

Factory Bot is great when creating 'presets' of ActiveRecord models. This is all you really need for most simple cases.

factory :user do
  name { 'John' }
  email { '[email protected]' }
create :user
# same as User.create(name: 'John', email: '[email protected]')

Using custom factories

At some point however, your models may get too complicated and you may need an actual factory—a class that constructs an object and performs actions along with it.

class UserCreator
  attr_reader :user

  def initialize(attrs)
    @user = User.create(attrs)
    @user.profile = Profile.create(@user)
    @user.posts = create_sample_post
creator = UserCreator.create(name: 'John')

Setting it up (the hard way)

Factory Bot will then consume a class in this manner:

user = = 'John'!

You can set up a factory_bot factory to use this by passing a class option. You'll have to make your factory implement these methods. This is silly and painful.

factory :real_user, class: 'UserCreator' do

Even easier

Why not use the attributes_for helper instead?

UserCreator.create attributes_for(:user)

Also see

Also see the Factory Bot cheatsheet, along with other cheatsheets from my cheatsheets archive.