Jawaban singkatnya adalah "Tidak". Bagian yang lebih menarik adalah mengapa / bagaimana situasi ini muncul.
Saya pikir kebingungan ini timbul karena Anda mencoba mematuhi praktik pengujian yang ketat (tes unit vs tes integrasi, mengejek, dll.) Untuk kode yang tampaknya tidak mematuhi praktik ketat.
Itu tidak berarti bahwa kode itu "salah", atau praktik tertentu lebih baik daripada yang lain. Sederhananya bahwa beberapa asumsi yang dibuat oleh praktik pengujian mungkin tidak berlaku dalam situasi ini, dan mungkin membantu untuk menggunakan tingkat "ketat" yang sama dalam praktik pengkodean dan praktik pengujian; atau setidaknya, untuk mengakui bahwa mereka mungkin tidak seimbang, yang akan menyebabkan beberapa aspek menjadi tidak berlaku atau berlebihan.
Alasan paling jelas adalah bahwa fungsi Anda melakukan dua tugas berbeda:
- Mencari
Person
berdasarkan nama mereka. Ini memerlukan pengujian integrasi, untuk memastikannya dapat menemukan Person
objek yang mungkin dibuat / disimpan di tempat lain.
- Menghitung apakah a
Person
sudah cukup umur, berdasarkan jenis kelamin mereka. Ini membutuhkan pengujian unit, untuk memastikan perhitungan berkinerja seperti yang diharapkan.
Dengan mengelompokkan tugas-tugas ini bersama menjadi satu blok kode, Anda tidak dapat menjalankan satu tanpa yang lainnya. Ketika Anda ingin menguji unit perhitungan, Anda dipaksa untuk mencari Person
(baik dari database nyata atau dari rintisan / mock). Ketika Anda ingin menguji apakah pencarian terintegrasi dengan seluruh sistem, Anda dipaksa untuk juga melakukan perhitungan pada usia. Apa yang harus kita lakukan dengan perhitungan itu? Haruskah kita mengabaikannya, atau memeriksanya? Tampaknya itu adalah kesulitan yang tepat yang Anda gambarkan dalam pertanyaan Anda.
Jika kita membayangkan suatu alternatif, kita mungkin memiliki perhitungan sendiri:
def is_old_enough?(person)
if person.male?
return person.age > 21
else
return person.age > 18
end
end
Karena ini adalah perhitungan murni, kami tidak perlu melakukan tes integrasi.
Kami juga mungkin tergoda untuk menulis tugas pencarian secara terpisah:
def person_from_name(name = 'filip')
return Person::API.new(name)
end
Namun, dalam hal ini fungsinya sangat dekat Person::API.new
sehingga saya katakan Anda harus menggunakannya (jika nama default diperlukan, apakah lebih baik disimpan di tempat lain, seperti atribut kelas?).
Saat menulis tes integrasi untuk Person::API.new
(atau person_from_name
) yang perlu Anda perhatikan adalah apakah Anda mendapatkan kembali yang diharapkan Person
; semua perhitungan berbasis usia diurus di tempat lain, sehingga tes integrasi Anda dapat mengabaikannya.