คำตอบสั้น ๆ คือ "ไม่" ส่วนที่น่าสนใจมากขึ้นคือสาเหตุ / วิธีสถานการณ์นี้อาจเกิดขึ้น
ฉันคิดว่าความสับสนเกิดขึ้นเพราะคุณกำลังพยายามปฏิบัติตามแนวทางการทดสอบที่เข้มงวด (การทดสอบหน่วยเทียบกับการรวมการทดสอบการเยาะเย้ย ฯลฯ ) สำหรับโค้ดที่ดูเหมือนจะไม่เป็นไปตามแนวทางปฏิบัติที่เข้มงวด
ไม่ได้หมายความว่ารหัสนั้น "ผิด" หรือการปฏิบัตินั้นดีกว่าวิธีอื่น เพียงว่าสมมติฐานบางข้อที่จัดทำโดยการทดสอบอาจไม่ใช้ในสถานการณ์นี้และอาจช่วยในการใช้ "ความเข้มงวด" ในระดับเดียวกันในการเขียนโปรแกรมและการทดสอบ หรืออย่างน้อยเพื่อรับทราบว่าพวกเขาอาจไม่สมดุลซึ่งจะทำให้บางแง่มุมไม่เหมาะสมหรือซ้ำซ้อน
เหตุผลที่ชัดเจนที่สุดคือฟังก์ชั่นของคุณกำลังทำงานสองอย่างที่แตกต่างกัน:
- มอง
Person
ตามชื่อของพวกเขา ต้องมีการทดสอบการรวมเพื่อให้แน่ใจว่าสามารถค้นหาPerson
วัตถุที่ถูกสร้างขึ้น / เก็บไว้ที่อื่น
- การคำนวณว่า a
Person
เก่าพอหรือไม่ขึ้นอยู่กับเพศของพวกเขา ต้องมีการทดสอบหน่วยเพื่อให้แน่ใจว่าการคำนวณมีประสิทธิภาพตามที่คาดไว้
โดยการจัดกลุ่มงานเหล่านี้เข้าด้วยกันเป็นหนึ่งบล็อคโค้ดคุณจะไม่สามารถเรียกใช้งานได้หากไม่มีงานอื่น เมื่อคุณต้องการทดสอบหน่วยการคำนวณคุณจะถูกบังคับให้ค้นหา a Person
(จากฐานข้อมูลจริงหรือจาก stub / mock) เมื่อคุณต้องการทดสอบว่าการค้นหาผสานกับส่วนที่เหลือของระบบคุณจะถูกบังคับให้ทำการคำนวณตามอายุด้วย เราควรทำอย่างไรกับการคำนวณนั้น? เราควรเพิกเฉยหรือตรวจสอบหรือไม่ ดูเหมือนจะเป็นสถานการณ์ที่แน่นอนที่คุณอธิบายในคำถามของคุณ
หากเราจินตนาการถึงทางเลือกเราอาจมีการคำนวณด้วยตัวเอง:
def is_old_enough?(person)
if person.male?
return person.age > 21
else
return person.age > 18
end
end
เนื่องจากนี่เป็นการคำนวณที่บริสุทธิ์เราจึงไม่จำเป็นต้องทำการทดสอบการรวมเข้าด้วยกัน
เราอาจถูกล่อลวงให้เขียนงานค้นหาแยกต่างหากเช่นกัน:
def person_from_name(name = 'filip')
return Person::API.new(name)
end
อย่างไรก็ตามในกรณีนี้ฟังก์ชั่นอยู่ใกล้กับPerson::API.new
ที่ฉันบอกว่าคุณควรจะใช้มันแทน (หากจำเป็นต้องใช้ชื่อเริ่มต้นมันจะถูกเก็บไว้ที่อื่นดีกว่าเช่นแอตทริบิวต์ class หรือไม่)
เมื่อเขียนการทดสอบการรวมสำหรับPerson::API.new
(หรือperson_from_name
) สิ่งที่คุณต้องใส่ใจคือว่าคุณได้รับสิ่งที่คาดหวังกลับมาPerson
หรือไม่ การคำนวณตามอายุทั้งหมดได้รับการดูแลจากที่อื่นดังนั้นการทดสอบการรวมกลุ่มของคุณจึงไม่สนใจ