2013-06-10 20 views
13

başarısız .FactoryGirl, has_one dernek ve doğrulama Bunlar 2 basit modellerdir

Ben de bu tryied ettik:

factory :post do 
    # fields... 

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

Ama bitti "Doğrulama başarısız: Varlık boş olamaz".

Durumumu nasıl gösteririm? aşağıdaki gibi

+0

Başka bir yol yerine '' '' '' '' '' varlık '' ayarını kurmanızın bir nedeni var mı?Oluşturma sırasında 'Post'' Asset' gerektiren bir'den beri garip görünüyor. – deefour

+0

Factory dernekler foreign_keys için değil has_one/Has_many dernekler için durmak. Yanlış mıyım? –

cevap

26

Bu sorunu (: derleme) geri aramasını kullanarak çözdüm.

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 

Bu şekilde, ilişkili nesneler, sahip olma sınıfı kaydedilmeden önce oluşturulacaktır, bu nedenle doğrulama geçer.

+0

diğer geri aramalar sonra' içerir Bu çalışıyor. Geri çağırma yapmadan önce yazdırılan geri çağırma içinde atadım. Nesne orada değil. Güncellendi mi? – thedanotto

+0

@MichDart bahsedilen olan göremediğimde sonra ': (oluşturmak)' ve –

0

Bunu ileterek çocuk ilişkisini önyükleyebilir:

FactoryGirl.define do 
    factory :post do 
    asset { Asset.create! } 
    end 
end 

(Daha da iyisi, Varlık fabrika kullanarak bu ayrıntılar önceden ayarlanmış olan varlık ilişkili oluşturmak için). (: Varlık)

diğer manuel yolu FactoryGirl.create üzerinden bir Varlık oluşturmak olacaktır ve değişken yaratma içine geçen yani: Hata Validation failed: Asset can't be blank olduğunu

asset = FactoryGirl.create(:asset) 
post = FactoryGirl.create(:post, asset: asset) 
+0

Teşekkürler, ancak çözümünüz, Varlık fabrikamda tanımladığım alanları içeren bir varlık mı oluşturuyor? 'Varlık: Eğer bu sizin varlık fabrikada tanımlanan aynı alanlara sahip bir varlık oluşturmak istiyorsanız –

+0

{FactoryGirl.create (: varlık)}' – HaaR

+0

Hala mu –

0

var gibi görünüyor, çünkü Fabrikalarınızda geriye doğru dernek. Bir post oluştururken

factory :post do 
    # fields... 
end 

Yani öylesine Doğrulama başarısız hayır asset yoktur. Bu

factory :post do 
# fields... 
    asset 
end 

bu wiki page and the associations section bir göz atın deneyin. Ayrıca FactoryGirl bir Post oluşturduğunda, bir varlık mevcut olması gerekir, çünkü doğrulama başarısız dernekler

+1

Bu çözümü denedim, ama çalışmadı. Bir döngü yaratır (bence). Kendi başına denedin mi? teşekkürler zaten –

2

ile create ve build arasındaki farkı açıklar. Yani, FactoryGirl tanımlarınızda, Post'un bir parçası olarak bir Asset oluşturabilirsiniz. FactoryGirl post.rb dosyası gibi bir şey girin:

asset { FactoryGirl.create(:asset) } 

veya

Sen aşağıdaki gibi spec dosyasında Post bildiriminin bir parçası olarak bir Asset oluşturabilirsiniz:

asset = FactoryGirl.create(:asset) 

FactoryGirl.create(:post, :asset => asset) 

teşekkür ederiz.

+0

Teşekkür ederim. İlk gönderiyi güncelledim. Ama hala başım belada. Bana yardımcı olabilir misiniz? (: Saplama) 'https://robots.thoughtbot.com/aint-no-calla-back-girl –