Factory Girl 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 Girl will then consume a class in this manner:

user = User.new
user.name = 'John'

You can set up a factory_girl 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 Girl cheatsheet, along with other cheatsheets from my cheatsheets archive.