2010-10-26 5 views
18

, ben:Fabrika Kız: Yeni bir kayıt oluşturmadan bir kaydı başka bir rekorla nasıl ilişkilendirebiliriz? Ben Fabrika Kız/Rspec2/Rayları 3.</p> <p>factories.rb</em><em>yılında kullanıyorum

Factory.define :user do |user| 
    user.name  'Some guy' 
    user.email  '[email protected]' 
    user.password 'password' 
end 

Factory.define :org_admin, :parent => :user do |user| 
    user.email '[email protected]' 
end 

Factory.define :user_with_membership_request, :parent => :user do |user| 
    user.email '[email protected]' 
end 

Factory.define :organization do |org| 
    org.name  'MEC' 
    org.description 'Mountain Equipment Co-op' 
end 

Factory.define :membership do |membership| 
    membership.user { Factory(:user) } 
    membership.organization { Factory(:organization) } 
end 

Factory.define :admin_membership, :parent => :membership do |membership| 
    membership.user { Factory(:org_admin) } 
    membership.is_admin true 
    membership.status 'active' 
end 

Factory.define :membership_request, :parent => :membership do |membership| 
    membership.user { Factory(:user_with_membership_request) } 
    membership.status 'requested' 
end 

sonra benim RSpec testte ben:

it 'should accept the membership request' do 
    @org_admin = Factory(:org_admin) 
    test_sign_in(@org_admin) 
    @organization = Factory(:organization) 
    @membership_request = Factory(:membership_request) 

    put :update, :organization_id => @organization.id, :id => @membership_request.id, :acceptance => 'approve' 
    ... 
    end 

Testi çalıştırdığımda, şunu elde ederim:

Başarısızlığın sebebini anlıyorum çünkü FactoryGirl başka bir kuruluş oluşturuyor (aynı isimle).

Fakat yapmak istediğim, aynı kuruluşla ilişkilendirilmiş birkaç üyelik oluşturmaktır. Bunu nasıl yaparım?

Teşekkürler.

Sean

cevap

18

Varolan örgütü kontrol eder ve onu kullanabilir veya hiçbiri varsa bir tane oluşturabilirsiniz:

Factory.define :membership do |membership| 
    membership.user { Factory(:user) } 
    membership.organization { Organization.first || Factory(:organization) } 
end 

FactoryGirl 4+ güncelleme:

Factory.define do 
    factory :membership do 
    user { create(:user) } 
    organization { Organization.first || create(:organization) } 
    end 
end 

başka bir yaklaşım benzersiz tanımlayıcılar kullanmaktır (örn : tekrar kullanmak istediğiniz her fabrika için adları), ardından oluşturmak için initialize_with kullanın:

factory :organization_1 do 
    ignore { organization_name 'Sample Organization 1' } 
    name { organization_name } 
    initialize_with { Organization.find_or_create_by_name(organization_name) } 
end 

Artık, :organization_1 referansı her zaman aynı Organization değerini alacaktır. Açıkçası, bunun çalışması için ayrı isimler kullanmalısınız. Bu

factory :membership do 
    organization { Organization.find_or_create_by(Factory.attributes_for(:organization))} 
end 

gibi bir şey Factory.attributes_for ile #find_or_create_by yönteminin kullanımı araya alıp yapabilir mongoid ile

+0

Teşekkürler Zeteic. Bunu kullandım. Şimdilik işe yarıyor. (Birden fazla Org olduğunda, sanırım başka bir çözüm bulmalıyım sanırım .. başka bir gün için başka bir problem ". –

4

İki şey var. 1. Factory(:organisation) için benzersiz isimler oluşturmak isteyebilirsiniz, bunu sizin için benzersiz bir şekilde oluşturacak olan Factory.sequence kullanarak elde edebilirsiniz. 2. Yeni bir tane oluşturmak yerine varolan nesneyi kullanmak için Factory(:membership_request, :organization => @organization) iletebilirsiniz.

+0

Teşekkürler Kunday. Ben de bunu kullandım. Fabrikada rspec testinden ziyade, her şeyden daha fazlasını tanımlamam gerekiyormuş gibi görünüyorum. Fabrikaları ve bunları daha üst düzeyde nasıl kullanacağımı hala anlamaya ihtiyacım var. Her iki önerinizi de kullanmış olmama rağmen doğru olanı işaretleyebilirim. –

+0

Cool Sean. Geçtiğimiz birkaç ay boyunca factory_girl kullanmanın farkına vardığımdan, testlerin% 50'sinden fazlası, rspec testinden oluşturulan bazı açık verilere dayanıyor. Ancak, modeliniz karmaşık hale geldiğinde yapmadığınız veri kurulumunun miktarı göz önüne alındığında, sanırım hala sorun yok. İşe yaradığını duyduğuma sevindim. – Kunday

İlgili konular