Orang-orang tampaknya telah menjelaskan beberapa cara dasar di mana mereka berbeda, tetapi ditinggalkan before(:all)
dan tidak menjelaskan dengan tepat mengapa mereka harus digunakan.
Saya yakin bahwa variabel instan tidak memiliki tempat untuk digunakan di sebagian besar spesifikasi, sebagian karena alasan yang disebutkan dalam jawaban ini , jadi saya tidak akan menyebutkannya sebagai opsi di sini.
biarkan blok
Kode dalam satu let
blok hanya dieksekusi ketika direferensikan, pemuatan lambat ini berarti bahwa urutan blok-blok ini tidak relevan. Ini memberi Anda sejumlah besar daya untuk mengurangi penyiapan berulang melalui spesifikasi Anda.
Salah satu contoh (sangat kecil dan dibuat-buat) ini adalah:
let(:person) { build(:person) }
subject(:result) { Library.calculate_awesome(person, has_moustache) }
context 'with a moustache' do
let(:has_moustache) { true }
its(:awesome?) { should be_true }
end
context 'without a moustache' do
let(:has_moustache) { false }
its(:awesome?) { should be_false }
end
Anda dapat melihat has_moustache
definisi yang berbeda di setiap kasus, tetapi tidak perlu mengulangi subject
definisi tersebut. Sesuatu yang penting untuk diperhatikan adalah let
blok terakhir yang ditentukan dalam konteks saat ini akan digunakan. Ini bagus untuk menyetel default agar digunakan untuk sebagian besar spesifikasi, yang dapat ditimpa jika perlu.
Misalnya, memeriksa nilai kembalian calculate_awesome
jika meneruskan person
model dengan top_hat
set ke true, tetapi tidak ada kumis akan menjadi:
context 'without a moustache but with a top hat' do
let(:has_moustache) { false }
let(:person) { build(:person, top_hat: true) }
its(:awesome?) { should be_true }
end
Hal lain yang perlu diperhatikan tentang blok let, mereka tidak boleh digunakan jika Anda mencari sesuatu yang telah disimpan ke database (yaitu Library.find_awesome_people(search_criteria)
) karena mereka tidak akan disimpan ke database kecuali mereka telah direferensikan. let!
atau before
balok adalah apa yang harus digunakan di sini.
Juga, jangan pernah gunakan before
untuk memicu eksekusi let
blok, inilah yang let!
dibuat untuk!
membiarkan! blok
let!
blok dieksekusi dalam urutan yang mereka definisikan (seperti blok sebelumnya). Satu perbedaan inti dengan blok before adalah Anda mendapatkan referensi eksplisit ke variabel ini, daripada harus kembali ke variabel instan.
Seperti halnya let
blok, jika beberapa let!
blok didefinisikan dengan nama yang sama, yang terbaru adalah apa yang akan digunakan dalam eksekusi. Perbedaan intinya adalah let!
blok akan dieksekusi beberapa kali jika digunakan seperti ini, sedangkan let
blok hanya akan dieksekusi terakhir kali.
sebelum (: setiap) blok
before(:each)
adalah default sebelum blokir, dan oleh karena itu dapat direferensikan before {}
daripada menentukan secara penuh before(:each) {}
setiap saat.
Ini adalah preferensi pribadi saya untuk menggunakan before
blok dalam beberapa situasi inti. Saya akan menggunakan sebelum blok jika:
- Saya menggunakan ejekan, stubbing, atau doubles
- Ada pengaturan ukuran yang wajar (umumnya ini adalah tanda bahwa sifat pabrik Anda belum diatur dengan benar)
- Ada sejumlah variabel yang tidak perlu saya rujuk secara langsung, tetapi diperlukan untuk penyiapan
- Saya sedang menulis tes pengontrol fungsional di rel, dan saya ingin menjalankan permintaan khusus untuk diuji (yaitu
before { get :index }
). Meskipun Anda dapat menggunakan subject
ini dalam banyak kasus, terkadang terasa lebih eksplisit jika Anda tidak memerlukan referensi.
Jika Anda menemukan diri Anda menulis before
blok besar untuk spesifikasi Anda, periksa pabrik Anda dan pastikan Anda memahami sepenuhnya sifat dan fleksibilitasnya.
sebelum (: semua) blok
Ini hanya akan dieksekusi sekali, sebelum spesifikasi dalam konteks saat ini (dan turunannya). Ini dapat digunakan untuk keuntungan besar jika ditulis dengan benar, karena ada situasi tertentu yang dapat mengurangi eksekusi dan upaya.
Salah satu contoh (yang hampir tidak memengaruhi waktu eksekusi sama sekali) adalah mengejek variabel ENV untuk pengujian, yang seharusnya hanya perlu Anda lakukan sekali.
Semoga membantu :)