Pertanyaan Apa perbedaan antara membangun dan membuat metode di FactoryGirl?


Pengenalan Gadis Pabrik menggambarkan 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 tidak mengerti perbedaan praktis antara keduanya. Dapatkah seseorang memberi contoh di mana Anda ingin menggunakan yang satu dan bukan yang lain? Terima kasih!


76
2017-12-31 05:57


asal


Jawaban:


Itu create() metode tetap contoh dari model sementara yang build() metode menyimpannya hanya di memori.

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

misalnya

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

Untuk memeriksa apakah suatu model memiliki atribut build() metode akan dilakukan karena tidak ada akses DB yang diperlukan.

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

Memperbarui

"Ada satu pengecualian yang membangun sebenarnya 'membuat' ketika Anda sedang membangun asosiasi, yaitu asosiasi Anda tidak lagi dalam memori tetapi bertahan. Ingatlah itu dalam pikiran" - Getar


95
2018-01-04 21:03



Menggunakan FactoryGirl.build(:factory_name) tidak berlanjut ke db dan tidak memanggil save!, sehingga validasi Rekaman Aktif Anda tidak akan berjalan. Ini jauh lebih cepat, tetapi validasi mungkin penting.

Menggunakan FactoryGirl.create(:factory_name) akan berlanjut ke db dan akan memanggil validasi Rekaman Aktif. Ini jelas lebih lambat tetapi dapat menangkap kesalahan validasi (jika Anda peduli tentang mereka dalam tes Anda).


10
2017-08-01 19:51



FactoryGirl.create() akan menciptakan objek dan asosiasi baru (jika pabrik memiliki) untuk itu. Mereka semua akan bertahan dalam database. Juga, ini akan memicu validasi model dan database. Callback 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 banyak kasus ketika menguji model yang terbaik untuk digunakan build_stubbed untuk kinerja yang lebih baik. Baca lebih lanjut tentang itu sini.


0
2018-05-04 10:00