FactoryGirl, has_one association and validation failed

Mich Dart picture Mich Dart · Jun 11, 2013 · Viewed 10.2k times · Source

These are 2 simple models:

class Post < ActiveRecord::Base
  has_one :asset, :dependent => :destroy

  validates :asset, presence: true
end

class Asset < ActiveRecord::Base
  belongs_to :post
end

I'm trying to create a factory like this:

  factory :post do
    # fields...

    asset { FactoryGirl.create(:asset) }
  end

  factory :asset do
    # fields...

    post
  end

But, running the spec it enters a loop.

I've also tryied this:

  factory :post do
    # fields...

    before(:create) do |post, evaluator|
      FactoryGirl.create_list(:asset, 1, post: post)
    end
  end

But ended up in "Validation failed: Asset can't be blank".

How do I represent my situation?

Answer

Mich Dart picture Mich Dart · Jun 13, 2013

I solved this problem using after(:build) callback.

factory :post do
    # fields...
    after(:build) do |post|
      post.asset ||= FactoryGirl.build(:asset, :post => post)
    end
end

factory :asset do
    # fields...
    after(:build) do |asset|
      asset.post ||= FactoryGirl.build(:post, :asset => asset)
    end
end

By this way, the associated objects will be created before the owning class is saved, so validation pass.