เท่าที่ฉันเข้าใจคนส่วนใหญ่ดูเหมือนจะยอมรับว่าวิธีการส่วนตัวไม่ควรทดสอบโดยตรง แต่ผ่านวิธีการสาธารณะใด ๆ เรียกพวกเขา ฉันสามารถเห็นประเด็นของพวกเขา แต่ฉันมีปัญหาบางอย่างกับเรื่องนี้เมื่อฉันพยายามติดตาม "สามกฏของ TDD" และใช้วงจร "สีแดง - เขียว - refactor" ฉันคิดว่าตัวอย่างอธิบายได้ดีที่สุด:
ตอนนี้ฉันต้องการโปรแกรมที่สามารถอ่านไฟล์ (ที่มีข้อมูลคั่นด้วยแท็บ) และกรองคอลัมน์ทั้งหมดที่มีข้อมูลที่ไม่ใช่ตัวเลข ฉันคิดว่าอาจมีเครื่องมือง่ายๆที่มีอยู่แล้วในการทำเช่นนี้ แต่ฉันตัดสินใจที่จะใช้มันตั้งแต่ต้นตัวเองเพราะฉันคิดว่ามันอาจเป็นโครงการที่ดีและสะอาดสำหรับฉันที่จะได้รับการฝึกฝนด้วย TDD
ดังนั้นก่อนอื่นฉัน "ใส่หมวกสีแดง" นั่นคือฉันต้องการการทดสอบที่ล้มเหลว ฉันคิดว่าฉันจะต้องใช้วิธีการที่พบเขตข้อมูลที่ไม่ใช่ตัวเลขทั้งหมดในบรรทัด ดังนั้นฉันจึงเขียนการทดสอบอย่างง่ายแน่นอนว่ามันไม่สามารถรวบรวมได้ทันทีดังนั้นฉันจึงเริ่มเขียนฟังก์ชั่นของตัวเองและหลังจากผ่านไปมาสองรอบ (แดง / เขียว) ฉันมีฟังก์ชั่นการทำงานและการทดสอบที่สมบูรณ์
ถัดไปฉันใช้ฟังก์ชัน "gatherNonNumericColumns" ที่อ่านไฟล์ครั้งละหนึ่งบรรทัดและเรียก "findNonNumericFields" ของฉัน - ฟังก์ชันในแต่ละบรรทัดเพื่อรวบรวมคอลัมน์ทั้งหมดที่ต้องถูกลบออกในที่สุด สองรอบสีแดงสีเขียวและฉันเสร็จแล้วมีอีกครั้งฟังก์ชั่นการทำงานและการทดสอบที่สมบูรณ์
ตอนนี้ฉันคิดว่าฉันควร refactor เนื่องจากวิธีการของฉัน "findNonNumericFields" ได้รับการออกแบบเพราะฉันคิดว่าฉันจะต้องใช้เมื่อใช้งาน "gatherNonNumericColumns" ดูเหมือนว่าฉันจะมีเหตุผลที่จะให้ "findNonNumericFields" เป็นแบบส่วนตัว อย่างไรก็ตามนั่นจะเป็นการทำลายการทดสอบครั้งแรกของฉันเนื่องจากพวกเขาจะไม่สามารถเข้าถึงวิธีการทดสอบได้อีกต่อไป
ดังนั้นฉันจบลงด้วยวิธีการส่วนตัวและชุดทดสอบที่ทดสอบ เนื่องจากผู้คนจำนวนมากให้คำแนะนำว่าไม่ควรทำการทดสอบวิธีส่วนตัวจึงรู้สึกเหมือนว่าฉันได้ทาสีตัวเองให้เป็นมุมตรงนี้ แต่ฉันล้มเหลวตรงไหน
ฉันรวบรวมฉันได้เริ่มต้นในระดับที่สูงขึ้นเขียนการทดสอบที่ทดสอบสิ่งที่ในที่สุดจะกลายเป็นวิธีการสาธารณะของฉัน (นั่นคือ findAndFilterOutAllNonNumericalColumns) แต่รู้สึกว่าค่อนข้างตรงข้ามกับจุดของ TDD (อย่างน้อยตามลุง Bob) : ว่าคุณควรสลับระหว่างการเขียนการทดสอบและรหัสการผลิตอย่างต่อเนื่องและ ณ เวลาใดก็ตามการทดสอบทั้งหมดของคุณจะทำงานภายในไม่กี่นาทีสุดท้าย เพราะถ้าฉันเริ่มต้นด้วยการเขียนการทดสอบสำหรับวิธีสาธารณะจะมีหลายนาที (หรือหลายชั่วโมงหรือหลายวันในกรณีที่ซับซ้อนมาก) ก่อนที่ฉันจะได้รับรายละเอียดทั้งหมดในวิธีการส่วนตัวในการทำงานเพื่อให้การทดสอบทดสอบสาธารณะ วิธีการผ่าน
แล้วจะทำอย่างไรดี? TDD (ที่มีรอบการเปลี่ยนสีเขียว - แดงอย่างรวดเร็ว) นั้นเข้ากันไม่ได้กับวิธีการส่วนตัวหรือไม่? หรือมีข้อบกพร่องในการออกแบบของฉัน?
private
ว่ามันเหมาะสมที่จะทำ