ทำไมคุณสมบัติการทดสอบหน่วยมักจะต้องมีวิธีการสาธารณะ?


12

ฉันเพิ่งสังเกตเห็นว่าการเพิ่ม [TestInitialize] ไปยังวิธีการที่ได้รับการป้องกันในชุดประกอบ. NET ไม่ได้รับความเคารพ แต่ถ้าฉันทำวิธีการแบบสาธารณะ ฉันสังเกตเห็นหลายครั้งในอดีตด้วยวิธีการทดสอบ

เทคนิคการพูดมันเป็นเรื่องง่ายที่จะสะท้อนให้เห็นถึงวิธีการส่วนตัวเป็นวิธีสาธารณะ ตามความเป็นจริงแล้วการไตร่ตรองเป็นวิธีที่ใช้ในการทดสอบหน่วยวิธีส่วนตัว

เหตุใดฉันจึงต้องทำให้วิธีการทดสอบหน่วยของฉันเป็นแบบสาธารณะทั้งหมด


2
นั่นเป็นคำถามที่ดีจริงๆ ข้อโต้แย้งที่ดีเพียงข้อเดียวที่ฉันได้ยินคือมันเป็นไปตามหลักการ "โปรแกรมไปยังส่วนต่อประสานไม่ใช่เพื่อการใช้งาน" เป็นส่วนหนึ่งของหลักการที่เป็นของแข็ง
Robert Harvey

9
ฉันไม่คิดว่าเขากำลังพูดถึงการทดสอบชั้นเรียนของเขาเขากำลังพูดถึงวิธีการทดสอบจริงที่ถูกเรียกโดยกรอบการทดสอบ
jtiger

1
@RobertHarvey ใน Java เหตุผลข้อ จำกัด ที่คล้ายกัน (เช่นใน JUnit) คือผู้ออกแบบเฟรมเวิร์กไม่ต้องการยุ่งกับsetAccessibleสิ่งใดซึ่งสามารถถูกบล็อกโดย SecurityManager ที่กำหนดเองบางคน
gnat

1
คุณต้องคำนึงว่าการตัดสินใจออกแบบนี้ทำขึ้นเพื่อวัตถุประสงค์ทั่วไปที่มีเป้าหมายสำหรับการใช้งานที่กว้างขวาง ในกรณีเช่นนี้มันปลอดภัยสำหรับผู้ออกแบบที่จะคาดเดาและเตรียมการที่เลวร้ายที่สุด ถ้าเป็นเช่นนั้นฉันไม่รู้กรอบงานภายใน บริษัท บางตัว (ซึ่งใคร ๆ สามารถมีโอกาสรับประกันนโยบายความปลอดภัยที่ต้องการ) หรือถ้าเป็นเครื่องมือแคบวัตถุประสงค์เฉพาะ (คิดว่า "ผู้ชมสำหรับสมาชิกที่ไม่สามารถเข้าถึงได้") นักออกแบบ จะมีตัวเลือกอื่น ๆ ให้พิจารณา
ริ้น

2
@GregBurghardt พฤติกรรมนี้พบใน Nunit และอาจเป็นไปได้ว่ากรอบงานทดสอบอื่น ๆ ที่ Microsoft ไม่ได้เขียน แน่นอนในช่วงหลายปีที่ผ่านมาตั้งแต่ถามคำถามนี้ฉันเข้าใจมากขึ้นเกี่ยวกับ. NET แต่ฉันยังคงคิดว่ามันเป็นคำถามที่ยุติธรรมและมีการอภิปรายที่ดีในความคิดเห็น
Justin Dearing

คำตอบ:


2

คุณควรทดสอบสิ่งที่ชั้นจะไม่ได้ว่ามันไม่ได้

เท่าที่ "นอกโลก" เป็นห่วงนั่นคือสิ่งที่ชั้นเรียนทำให้สาธารณชนสามารถใช้ได้; กรอบการทดสอบของคุณสร้างสมมติฐานเดียวกัน

โดยการทดสอบอะไรที่ "น้อย" กว่าสาธารณะคุณกำลังพิจารณาถึงการนำไปใช้ภายในของชั้นเรียนซึ่งเป็นแนวคิดที่ไม่ดี


โปรดทราบว่าคำถามนั้นเกี่ยวกับวิธีการทดสอบไม่ใช่วิธีการทดสอบในระบบ ในขณะที่มันเป็นจริงที่ OP ระบุว่าคุณสามารถใช้การไตร่ตรองเพื่อทดสอบสิ่งที่ "น้อย" กว่าสาธารณะมันเป็นข้อโต้แย้งเกี่ยวกับความสามารถของกรอบการทดสอบในการเข้าถึงวิธีการส่วนตัว เฟรมเวิร์กการทดสอบต้องใช้การสะท้อนเพื่อค้นหาวิธีการทดสอบ (ซึ่งถูกทำเครื่องหมายโดยคุณลักษณะ) และดังนั้นจึงต้องใช้การไตร่ตรองโดยที่ในใจ ... "ทำไมฉันต้องทำให้วิธีการทดสอบหน่วยของฉันเป็นแบบสาธารณะทั้งหมด"
ธีระโรจน์

วิธีทดสอบมีความสามารถในการเข้าถึงวิธีการส่วนตัว ด้วย Reflection ทุกอย่างเป็นไปได้ ฉันเห็นคำถามนี้เกี่ยวกับความปรารถนาที่จะทำเช่นนั้น
Phill W.

0

โดยทั่วไปแล้ววิธีที่ดีที่สุดคือเข้าถึงวิธีสาธารณะเท่านั้นเมื่อคุณสร้างคลาสคุณจะต้องสร้างสัญญาตามที่คลาสอื่นควรเข้าถึงรหัสของคุณ ดังนั้นคำตอบน่าจะเป็นเพราะการประชุม


1
นี่ไม่ได้ตอบคำถามจริงๆ
Rubberduck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.