Kısa cevap "Hayır" dır. Daha ilginç olan kısım, bu durumun neden / nasıl ortaya çıkabileceğidir.
Sanırım karışıklık ortaya çıkıyor, çünkü sıkı uygulamalara uymuyor gibi görünen kod için katı test uygulamalarına (birim testleri - entegrasyon testleri, alaycı vb.) Uymaya çalışıyorsunuz.
Bu, kodun "yanlış" olduğunu veya belirli uygulamaların diğerlerinden daha iyi olduğunu söylemez. Basitçe, test uygulamaları tarafından yapılan varsayımların bazıları bu durumda geçerli olmayabilir ve kodlama uygulamalarında ve test uygulamalarında benzer bir "katılık" seviyesi kullanmaya yardımcı olabilir; veya en azından, dengesiz olduklarını kabul etmek, bu da bazı yönlerin uygulanamaz veya gereksiz olmasına neden olacaktır.
En belirgin nedeni, işlevinizin iki farklı görevi gerçekleştirmesidir:
- Adlarına
Person
göre bir ararken . Bu Person
, muhtemelen başka yerde yaratılmış / depolanmış nesneleri bulabildiğinden emin olmak için entegrasyon testi gerektirir .
Person
Cinsiyetlerine göre yeterince yaşlı olup olmadığını hesaplamak . Bu, hesaplamanın beklendiği gibi yapıldığından emin olmak için birim testini gerektirir.
Bu görevleri bir kod bloğunda gruplandırarak, birini diğeri olmadan çalıştıramazsınız. Hesaplamaları test etmek istediğinizde, Person
(ya gerçek bir veri tabanından ya da bir saplama / alaydan) bakmak zorunda kalırsınız . Aramanın sistemin geri kalanıyla bütünleştiğini test etmek istediğinizde, yaşınıza göre bir hesaplama yapmak zorunda kalırsınız. Bu hesaplama ile ne yapmalıyız? Görmezden mi gelmeliyiz yoksa kontrol edelim mi? Bu, sorunuzda tarif ettiğiniz kesin çıkmaz gibi görünüyor.
Bir alternatif hayal edersek, hesaplamayı kendi başımıza yapabiliriz:
def is_old_enough?(person)
if person.male?
return person.age > 21
else
return person.age > 18
end
end
Bu saf bir hesaplama olduğundan, üzerinde entegrasyon testleri yapmak zorunda değiliz.
Arama görevini de ayrıca yazmak isteyebiliriz:
def person_from_name(name = 'filip')
return Person::API.new(name)
end
Ancak, bu durumda, işlevsellik o kadar yakındır Person::API.new
ki, onu kullanmanız gerektiğini söyleyeceğim (varsayılan ad gerekliyse, başka bir yerde, bir sınıf niteliği gibi depolanması daha iyi olur mu?).
Person::API.new
(Veya person_from_name
) için bütünleştirme testleri yazarken, tek yapmanız gereken, beklentileri geri alıp almadığınızdır Person
; Tüm yaşa dayalı hesaplamalar başka yerlerde de yapılır, böylece entegrasyon testleriniz bunları görmezden gelebilir.