ต้องการทดสอบอินเตอร์เฟสมากกว่าการทดสอบการนำไปใช้
ฉันเข้าใจว่าวิธีการส่วนตัวไม่สามารถทดสอบได้
ขึ้นอยู่กับสภาพแวดล้อมการพัฒนาของคุณดูด้านล่าง
[วิธีการส่วนตัว] ไม่น่าเป็นห่วงเพราะ public API จะให้ข้อมูลที่เพียงพอสำหรับการตรวจสอบความสมบูรณ์ของวัตถุ
ถูกต้องแล้ว TDD มุ่งเน้นไปที่การทดสอบอินเตอร์เฟส
วิธีการส่วนตัวคือรายละเอียดการใช้งานที่สามารถเปลี่ยนแปลงได้ในระหว่างรอบปัจจัยใด ๆ มันควรจะเป็นไปได้ที่จะปรับปัจจัยโดยไม่ต้องเปลี่ยนอินเตอร์เฟซหรือพฤติกรรมกล่องดำ ในความเป็นจริงนั้นเป็นส่วนหนึ่งของประโยชน์ของ TDD ความสะดวกที่คุณสามารถสร้างความมั่นใจได้ว่าการเปลี่ยนแปลงภายในเป็นคลาสจะไม่ส่งผลกระทบต่อผู้ใช้ของคลาสนั้น
เป็นไปได้ที่ฉันจะสร้างวัตถุที่มีเพียงวิธีการส่วนตัวและโต้ตอบกับวัตถุอื่น ๆ โดยฟังเหตุการณ์ของพวกเขา สิ่งนี้จะถูกห่อหุ้มไว้มาก แต่ไม่สามารถทดสอบได้อย่างสมบูรณ์
แม้ว่าระดับไม่มีวิธีการสาธารณะก็จัดการเหตุการณ์ที่มีมันเป็นอินเตอร์เฟซที่สาธารณะและต่อต้านว่า อินเตอร์เฟซที่สาธารณะที่คุณสามารถทดสอบ
เนื่องจากเหตุการณ์เป็นส่วนต่อประสานจึงเป็นเหตุการณ์ที่คุณจะต้องสร้างเพื่อทดสอบวัตถุนั้น
มองการใช้วัตถุจำลองเป็นกาวสำหรับระบบทดสอบของคุณ มันควรจะเป็นไปได้ที่จะสร้างวัตถุจำลองที่เรียบง่ายที่สร้างเหตุการณ์และรับการเปลี่ยนแปลงสถานะของผลลัพธ์ (เป็นไปได้โดยวัตถุจำลองผู้รับอื่น)
นอกจากนี้ยังถือว่าเป็นการปฏิบัติที่ไม่ดีในการเพิ่มวิธีการเพื่อการทดสอบ
แน่นอนคุณควรระมัดระวังในการเปิดเผยสถานะภายใน
นี่หมายความว่า TDD ขัดแย้งกับการห่อหุ้มหรือไม่? ความสมดุลที่เหมาะสมคืออะไร?
ไม่ได้อย่างแน่นอน.
TDD ไม่ควรเปลี่ยนการใช้คลาสของคุณนอกเหนือจากเพื่อทำให้ง่ายขึ้น (โดยการใช้YAGNIจากจุดก่อนหน้า)
แนวปฏิบัติที่ดีที่สุดกับ TDD นั้นเหมือนกับแนวปฏิบัติที่ดีที่สุดหากไม่มี TDD คุณจะพบว่าทำไมเร็วกว่านี้เพราะคุณกำลังใช้อินเทอร์เฟซในขณะที่คุณกำลังพัฒนา
ฉันอยากจะเปิดเผยวิธีส่วนใหญ่หรือทั้งหมดของฉันต่อสาธารณะในขณะนี้ ...
นี่คงเป็นการโยนทารกออกไปด้วยน้ำอาบ
คุณไม่จำเป็นต้องเปิดเผยวิธีการทั้งหมดเพื่อให้คุณสามารถพัฒนาในลักษณะ TDD ดูบันทึกของฉันด้านล่างเพื่อดูว่าวิธีการส่วนตัวของคุณไม่สามารถทดสอบได้จริงหรือไม่
ดูรายละเอียดเพิ่มเติมเกี่ยวกับการทดสอบวิธีการส่วนตัว
หากคุณต้องทดสอบหน่วยพฤติกรรมบางอย่างของชั้นเรียนโดยขึ้นอยู่กับภาษา / สภาพแวดล้อมคุณอาจมีสามตัวเลือก:
- ทำการทดสอบในชั้นเรียนที่คุณต้องการทดสอบ
- ใส่การทดสอบในไฟล์คลาส / ซอร์สอื่นและเปิดเผยวิธีส่วนตัวที่คุณต้องการทดสอบเป็นวิธีสาธารณะ
- ใช้สภาพแวดล้อมการทดสอบที่ช่วยให้คุณแยกรหัสทดสอบและรหัสการผลิตออกจากกัน แต่ยังคงอนุญาตให้ใช้รหัสการทดสอบเพื่อเข้าถึงวิธีการส่วนตัวของรหัสการผลิต
เห็นได้ชัดว่าตัวเลือกที่ 3 นั้นดีที่สุด
1) ใส่การทดสอบในชั้นเรียนที่คุณต้องการทดสอบ (ไม่เหมาะ)
การจัดเก็บกรณีทดสอบในไฟล์ class / source เดียวกันกับรหัสการผลิตภายใต้การทดสอบเป็นตัวเลือกที่ง่ายที่สุด แต่ถ้าไม่มีตัวประมวลผลล่วงหน้าหรือคำอธิบายประกอบมากมายคุณจะต้องจบด้วยรหัสทดสอบที่แจ้งรหัสการผลิตของคุณโดยไม่จำเป็นและขึ้นอยู่กับว่าคุณได้จัดโครงสร้างรหัสของคุณอย่างไร
2) เปิดเผยวิธีส่วนตัวที่คุณต้องการทดสอบเป็นวิธีสาธารณะ (ไม่ใช่ความคิดที่ดีจริงๆ)
ดังที่แนะนำว่านี่เป็นวิธีปฏิบัติที่แย่มาก ๆ ทำลายการห่อหุ้มและจะทำให้เกิดการใช้งานภายในกับผู้ใช้รหัส
3) ใช้สภาพแวดล้อมการทดสอบที่ดีขึ้น (ตัวเลือกที่ดีที่สุดถ้ามี)
ในโลกคราส 3. สามารถทำได้โดยการใช้ชิ้นส่วน ในโลก C # เราอาจใช้การเรียนบางส่วน ภาษาอื่น ๆ / สภาพแวดล้อมมักจะมีฟังก์ชั่นที่คล้ายกันคุณเพียงแค่ต้องค้นหามัน
สมมติว่าการสุ่มสี่สุ่มห้า 1. หรือ 2 เป็นทางเลือกเพียงอย่างเดียวที่น่าจะส่งผลให้ซอฟต์แวร์การผลิตป่องด้วยรหัสการทดสอบหรืออินเทอร์เฟซที่น่ารังเกียจในชั้นเรียนที่ล้างผ้าลินินสกปรกในที่สาธารณะ * 8)
- ทั้งหมดในทุก - มันจะดีกว่ามากที่จะไม่ทดสอบกับการใช้งานส่วนตัวแม้ว่า