Apa perbedaan antara metode build dan create di FactoryGirl?

95

Pengenalan Factory Girl menjelaskan perbedaan antara FactoryGirl.build()dan FactoryGirl.create():

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

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

Saya masih belum memahami perbedaan praktis antara keduanya. Dapatkah seseorang memberikan contoh di mana Anda ingin menggunakan yang satu dan bukan yang lain? Terima kasih!

Avery
sumber

Jawaban:

117

The create()Metode berlanjut contoh model sedangkan build()metode menyimpannya hanya pada memori.

Secara pribadi, saya menggunakan create()metode ini hanya jika ketekunan benar-benar diperlukan karena menulis ke DB membuat pengujian memakan waktu.

misalnya

Saya membuat pengguna untuk otentikasi create()karena mesin otentikasi saya menanyakan DB.

Untuk memeriksa apakah suatu model memiliki atribut, build()metode ini akan melakukannya karena tidak diperlukan akses DB.

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

Memperbarui

"Ada satu pengecualian yang membangun benar-benar 'menciptakan' saat Anda membangun asosiasi, yaitu asosiasi Anda tidak lagi dalam memori tetapi bertahan. Ingatlah itu" - Shakes

Helio Santos
sumber
16
Ada satu pengecualian bahwa build sebenarnya 'menciptakan' saat Anda membangun asosiasi, yaitu asosiasi Anda tidak lagi dalam memori tetapi dipertahankan. Ingatlah itu
Shakes
@ Shakes, saya tidak bekerja di rel lagi. Aku akan memeriksanya secepat mungkin.
Helio Santos
Adakah yang pernah membuat alat untuk mengganti setiap contoh createdengan build, dan membatalkannya jika pengujian gagal?
mgold
Apakah #createmembaca dan mengembalikan objek yang ada dari disk, atau mengembalikan objek yang ada di memori setelah menyimpannya? Dengan kata lain, apakah melakukan create(...)setara dengan create(...).reload?
Dennis
@mgold Vim cukup pandai dalam hal semacam itu.
Penebusan Terbatas
15

Penggunaan FactoryGirl.build(:factory_name)tidak bertahan pada db dan tidak memanggil save!, jadi validasi Rekaman Aktif Anda tidak akan berjalan. Ini jauh lebih cepat, tetapi validasi mungkin penting.

Penggunaan FactoryGirl.create(:factory_name)akan tetap ada di db dan akan memanggil validasi Rekaman Aktif. Ini jelas lebih lambat tetapi dapat menangkap kesalahan validasi (jika Anda peduli tentang mereka dalam pengujian Anda).

jurang
sumber
11
Atau, Anda bisa melakukan FactoryGirl.build (: factory_name) .valid? yang menjalankan validasi tanpa menyimpan ke database.
jinavar1
1

FactoryGirl.create()akan membuat objek dan asosiasi baru (jika pabrik memilikinya) untuk itu. Semuanya akan disimpan dalam database. Selain itu, ini akan memicu validasi model dan database. Panggilan balik after(:build)dan after(:create)akan dipanggil setelah pabrik disimpan. Juga before(:create)akan dipanggil sebelum pabrik disimpan.

FactoryGirl.build()tidak akan menyimpan objek, tetapi masih akan membuat permintaan ke database jika pabrik memiliki asosiasi. Ini akan memicu validasi hanya untuk objek terkait. Callback after(:build)akan dipanggil setelah pabrik dibangun.

Perhatikan bahwa dalam kebanyakan kasus, model pengujian paling baik digunakan build_stubbeduntuk kinerja yang lebih baik. Baca lebih lanjut di sini .

Nesha Zoric
sumber