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.