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?
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.
The validation is failing because when FactoryGirl
creates a Post
, an asset must be present. So in your FactoryGirl
definitions you can create an Asset
as part of creating a Post
. Insert something like the FactoryGirl post.rb
file:
asset { FactoryGirl.create(:asset) }
or
You can create an Asset
as part of your Post
declaration in your spec file such as the following:
asset = FactoryGirl.create(:asset)
FactoryGirl.create(:post, :asset => asset)
Thanks.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With