RSpec - Çiftleri Test Et
Bu bölümde, RSpec Mocks olarak da bilinen RSpec Doubles'ı tartışacağız. Çift, başka bir nesne için "ayakta durabilen" bir nesnedir. Muhtemelen bunun tam olarak ne anlama geldiğini ve neden ihtiyacın olduğunu merak ediyorsundur.
Diyelim ki bir okul için bir uygulama oluşturuyorsunuz ve bir öğrenci sınıfını temsil eden bir sınıfınız ve öğrenciler için başka bir sınıfınız var, yani bir Classroom ve bir Öğrenci sınıfınız var. Önce sınıflardan birinin kodunu yazmanız gerekir, o halde şunu söyleyelim, Classroom sınıfıyla başlayın -
class ClassRoom
def initialize(students)
@students = students
end
def list_student_names
@students.map(&:name).join(',')
end
end
Bu basit bir sınıftır, bir yöntem list_student_names'e sahiptir, bu da virgülle ayrılmış öğrenci adları dizesini döndürür. Şimdi, bu sınıf için testler oluşturmak istiyoruz ama henüz Öğrenci sınıfını oluşturmadıysak bunu nasıl yapacağız? Double testine ihtiyacımız var.
Ayrıca, bir Öğrenci nesnesi gibi davranan "sahte" bir sınıfımız varsa, ClassRoom testlerimiz Öğrenci sınıfına bağlı olmayacaktır. Biz buna test izolasyonu diyoruz.
ClassRoom testlerimiz başka herhangi bir sınıfa bağlı değilse, o zaman bir test başarısız olduğunda, ClassRoom sınıfımızda bir hata olduğunu ve başka bir sınıfta olmadığını hemen anlarız. Gerçek dünyada, başka biri tarafından yazılmış başka bir sınıfla etkileşime girmesi gereken bir sınıf oluşturuyor olabileceğinizi unutmayın.
RSpec Doubles'ın (alayların) faydalı olduğu yer burasıdır. List_student_names yöntemimiz, @students üye değişkenindeki her Student nesnesinde name yöntemini çağırır. Bu nedenle, bir isim yöntemi uygulayan bir Double'a ihtiyacımız var.
Bir RSpec Örneği (test) ile birlikte ClassRoom kodu aşağıda verilmiştir, ancak Öğrenci sınıfı tanımlanmadığına dikkat edin -
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
Yukarıdaki kod çalıştırıldığında aşağıdaki çıktıyı üretecektir. Geçen süre bilgisayarınızda biraz farklı olabilir -
.
Finished in 0.01 seconds (files took 0.11201 seconds to load)
1 example, 0 failures
Gördüğünüz gibi, bir test doubletanımlanmamış veya kullanılamayan bir sınıfa bağlı olduğunda bile kodunuzu test etmenizi sağlar. Ayrıca, bu, bir test başarısızlığı olduğunda, bunun başka birinin yazdığı bir sınıf değil, sınıfınızdaki bir sorundan kaynaklandığını hemen söyleyebileceğiniz anlamına gelir.