FactoryGirl'deki oluşturma ve oluşturma yöntemleri arasındaki fark nedir?


97

Fabrika Kızı tanıtımı , FactoryGirl.build()ve arasındaki farkı açıklar FactoryGirl.create():

# Returns a User instance that's not saved
user = FactoryGirl.build(:user)

# Returns a saved User instance
user = FactoryGirl.create(:user)

Hala ikisi arasındaki pratik farkları anlamıyorum. Biri başka birini değil de birini kullanmak isteyeceğiniz bir örnek verebilir mi? Teşekkürler!

Yanıtlar:


121

create()Ederken yöntem modelinin örneğini devam build()yöntem yalnızca belleğe tutar.

Şahsen ben bu create()yöntemi sadece kalıcılık gerçekten gerekli olduğunda kullanıyorum çünkü DB'ye yazmak testi zaman alıcı hale getiriyor.

Örneğin

Kimlik create()doğrulama motorum veritabanını sorguladığı için kimlik doğrulaması için kullanıcılar oluşturuyorum .

Bir modelin bir özniteliğe sahip olup olmadığını kontrol etmek için build()yöntem, DB erişimi gerekmediği için yapacaktır.

it{Factory.build(:user).should respond_to(:name)}

Güncelleme

"İlişkilendirme kurarken derlemenin aslında 'yarattığı' bir istisna vardır, yani ilişkiniz artık bellekte değil kalıcıdır. Bunu aklınızda bulundurun" - Shakes


16
İlişkilendirmeler oluştururken derlemenin aslında 'yarattığı' bir istisna vardır, yani ilişkiniz artık bellekte değil, kalıcıdır. Bunu unutmayın
Shakes

@ Shakes, artık raylarda çalışmıyorum. Bunu olabildiğince çabuk kontrol edeceğim.
Helio Santos

Herkes her geçtiği yerde değiştirmek için bir araç yaptı mı createile buildve test başarısız olursa o geri?
mgold

Mu #createokuyup diskten kalıcı nesneyi döndürmek, ya da persisting sonra bellekte nesneyi o en çıkmıyor? Başka bir deyişle, yapmak create(...)eşdeğer create(...).reloadmidir?
Dennis

@mgold Vim bu tür şeylerde oldukça iyidir.
lmat - Monica'yı eski durumuna getir

15

Kullanımı FactoryGirl.build(:factory_name)db için kalıcı değildir ve çağırmaz save!, bu nedenle Aktif Kayıt doğrulamalarınız çalışmayacaktır. Bu çok daha hızlıdır, ancak doğrulamalar önemli olabilir.

Kullanımı FactoryGirl.create(:factory_name)db için devam edecek ve Aktif Kayıt doğrulamalarını çağıracaktır. Bu açıkça daha yavaştır, ancak doğrulama hatalarını yakalayabilir (testlerinizde bunları önemsiyorsanız).


11
Veya, FactoryGirl.build (: factory_name) .valid veritabanına kaydetmeden doğrulamaları çalıştıran.
jinavar1

1

FactoryGirl.create()onun için (fabrikada varsa) yeni nesne ve ilişkiler yaratacaktır. Hepsi bir veritabanında saklanacak. Ayrıca, hem model hem de veritabanı doğrulamalarını tetikleyecektir. Geri aramalar after(:build)ve after(:create)fabrika kaydedildikten sonra aranacaktır. Ayrıca before(:create)fabrika kaydedilmeden önce aranacaktır.

FactoryGirl.build()bir nesneyi kaydetmez, ancak fabrikada ilişkilendirmeler varsa yine de bir veritabanına istekte bulunur. Yalnızca ilişkili nesneler için doğrulamaları tetikler. after(:build)Fabrika kurulduktan sonra geri arama aranacaktır .

Çoğu durumda modelleri test ederken build_stubbeddaha iyi performans için kullanmak en iyisidir . Bununla ilgili daha fazlasını buradan okuyun .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.