Soru Factory Girl: Yeni bir kayıt oluşturmadan bir rekoru başka bir rekorla nasıl ilişkilendirebiliriz?


Fabrika Kız / Rspec2 / Rails 3 kullanıyorum.

İçinde factories.rb, Sahibim:

Factory.define :user do |user|
  user.name       'Some guy'
  user.email      'some_guy@somewhere.org'
  user.password   'password'
end

Factory.define :org_admin, :parent => :user do |user|
  user.email 'org_admin@somehwere.org'
end

Factory.define :user_with_membership_request, :parent => :user do |user|
  user.email 'user_with_membership_request@somehwere.org'
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

ve sonra rspec testimde var:

  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:

 Failure/Error: @membership_request = Factory(:membership_request)
 Validation failed: Name has already been taken

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

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

Teşekkürler.

Sean


18
2017-10-26 19:07


Menşei




Cevaplar:


Varolan bir kuruluşu denetleyebilir ve kullanabilir veya 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, yeniden kullanmak istediğiniz her fabrika için benzersiz tanımlayıcıların (ör.: Adlar) kullanılmasıdır. initialize_with onu üretmek için:

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

Şimdi herhangi bir referans :organization_1 her zaman aynı şeyi alacak Organization. Açıkçası, bunun çalışması için ayrı isimler kullanmalısınız.


19
2017-10-26 19:28



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 ". - Sean Lerner


İki şey var. 1. Hala benzersiz isimler oluşturmak isteyebilirsiniz Factory(:organisation) bunu kullanarak başarabilirsin Factory.sequence Bu sizin için benzersiz bir şekilde üretecektir. 2. Bir geçiş yapabilirsiniz Factory(:membership_request, :organization => @organization) Yeni bir tane oluşturmak yerine mevcut nesneyi kullanmak.


4
2017-10-26 19:14



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. - Sean Lerner
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


Mongoid ile #find_or_create_by yöntemini Factory.attributes_for ile birleştirebilir ve böyle bir şey yapabilirsiniz

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

Eminim ActiveRecord'un benzer bir şeyi var.


2
2017-10-11 17:32