RSpec - Tes Ganda
Dalam chapter ini, kita akan membahas RSpec Ganda, juga dikenal sebagai RSpec Mocks. Double adalah sebuah objek yang dapat “berdiri” untuk objek lain. Anda mungkin bertanya-tanya apa artinya sebenarnya dan mengapa Anda membutuhkannya.
Katakanlah Anda sedang membuat aplikasi untuk sekolah dan Anda memiliki kelas yang mewakili satu kelas siswa dan kelas lain untuk siswa, yaitu Anda memiliki kelas Ruang Kelas dan kelas Siswa. Anda perlu menulis kode untuk salah satu kelas terlebih dahulu, jadi katakanlah, mulailah dengan kelas Classroom -
class ClassRoom
def initialize(students)
@students = students
end
def list_student_names
@students.map(&:name).join(',')
end
end
Ini adalah kelas sederhana, ia memiliki satu metode list_student_names, yang mengembalikan string nama siswa yang dipisahkan koma. Sekarang, kami ingin membuat tes untuk kelas ini tetapi bagaimana kami melakukannya jika kami belum membuat kelas Siswa? Kami membutuhkan tes Double.
Selain itu, jika kita memiliki kelas "dummy" yang berperilaku seperti objek Siswa, maka pengujian ClassRoom kita tidak akan bergantung pada kelas Siswa. Kami menyebutnya isolasi tes.
Jika pengujian ClassRoom kami tidak bergantung pada kelas lain, maka saat pengujian gagal, kami dapat segera mengetahui bahwa ada bug di kelas ClassRoom kami dan bukan kelas lain. Ingatlah bahwa, di dunia nyata, Anda mungkin sedang membangun kelas yang perlu berinteraksi dengan kelas lain yang ditulis oleh orang lain.
Di sinilah RSpec Ganda (mengolok-olok) menjadi berguna. Metode list_student_names kami memanggil metode nama pada setiap objek Mahasiswa dalam variabel anggota @students. Oleh karena itu, kita membutuhkan Double yang mengimplementasikan metode nama.
Berikut adalah kode untuk Kelas bersama dengan Contoh RSpec (tes), namun perhatikan bahwa tidak ada kelas Siswa yang ditentukan -
class ClassRoom
def initialize(students)
@students = students
end
def list_student_names
@students.map(&:name).join(',')
end
end
describe ClassRoom do
it 'the list_student_names method should work correctly' do
student1 = double('student')
student2 = double('student')
allow(student1).to receive(:name) { 'John Smith'}
allow(student2).to receive(:name) { 'Jill Smith'}
cr = ClassRoom.new [student1,student2]
expect(cr.list_student_names).to eq('John Smith,Jill Smith')
end
end
Ketika kode di atas dijalankan, maka akan menghasilkan keluaran sebagai berikut. Waktu yang berlalu mungkin sedikit berbeda di komputer Anda -
.
Finished in 0.01 seconds (files took 0.11201 seconds to load)
1 example, 0 failures
Seperti yang Anda lihat, menggunakan file test doublememungkinkan Anda untuk menguji kode Anda bahkan ketika itu bergantung pada kelas yang tidak ditentukan atau tidak tersedia. Selain itu, ini berarti bahwa ketika ada tes yang gagal, Anda dapat langsung mengetahui bahwa itu karena masalah di kelas Anda dan bukan kelas yang ditulis oleh orang lain.