ใช่ SOLID เป็นวิธีที่ดีมากในการออกแบบรหัสที่สามารถทดสอบได้ง่าย ในฐานะที่เป็นสีรองพื้นสั้น:
S - หลักการความรับผิดชอบเดี่ยว: วัตถุควรทำสิ่งหนึ่งอย่างแน่นอนและควรเป็นวัตถุเดียวใน codebase ที่ทำสิ่งนั้น ตัวอย่างเช่นเรียนโดเมนพูดใบแจ้งหนี้ คลาสใบแจ้งหนี้ควรแสดงโครงสร้างข้อมูลและกฎเกณฑ์ทางธุรกิจของใบแจ้งหนี้ที่ใช้ในระบบ ควรเป็นคลาสเดียวที่แสดงใบแจ้งหนี้ใน codebase สิ่งนี้สามารถแยกย่อยได้อีกเพื่อบอกว่าวิธีหนึ่งควรมีจุดประสงค์เดียวและควรเป็นวิธีเดียวใน codebase ที่ตรงกับความต้องการนี้
โดยทำตามหลักการนี้คุณเพิ่มความสามารถในการทดสอบของการออกแบบของคุณโดยลดจำนวนการทดสอบที่คุณต้องเขียนที่ทดสอบการทำงานเดียวกันบนวัตถุที่แตกต่างกันและโดยทั่วไปแล้วคุณจะจบลงด้วยการทำงานที่เล็ก
O - เปิด / ปิดหลักการ: ชั้นควรจะเปิดให้ขยายปิด แต่มีการเปลี่ยนแปลง เมื่อวัตถุมีอยู่และทำงานอย่างถูกต้องแล้วก็ไม่จำเป็นต้องกลับไปที่วัตถุนั้นเพื่อทำการเปลี่ยนแปลงที่เพิ่มฟังก์ชันการทำงานใหม่ แต่วัตถุควรขยายออกไปไม่ว่าจะโดยการได้มาหรือโดยการเสียบการประยุกต์ใช้การพึ่งพาใหม่หรือแตกต่างกันไปเพื่อให้การทำงานใหม่นั้น วิธีนี้จะหลีกเลี่ยงการถดถอย คุณสามารถนำเสนอฟังก์ชั่นใหม่ได้ทุกเมื่อและทุกเวลาที่ต้องการโดยไม่ต้องเปลี่ยนพฤติกรรมของวัตถุตามที่ใช้อยู่แล้วในที่อื่น
โดยการปฏิบัติตามหลักการนี้โดยทั่วไปคุณจะเพิ่มความสามารถของรหัสในการทนต่อ "mocks" และคุณยังต้องหลีกเลี่ยงการเขียนการทดสอบซ้ำเพื่อคาดการณ์พฤติกรรมใหม่ การทดสอบที่มีอยู่ทั้งหมดสำหรับวัตถุควรยังคงทำงานในการใช้งานไม่ขยายในขณะที่การทดสอบใหม่สำหรับฟังก์ชันการทำงานใหม่โดยใช้การใช้งานเพิ่มเติมควรทำงาน
หลักการทดแทน L - Liskov: คลาส A ขึ้นอยู่กับคลาส B ควรใช้ X: B ใด ๆ โดยไม่ทราบความแตกต่าง นี่หมายความว่าโดยทั่วไปแล้วสิ่งใดก็ตามที่คุณใช้เป็นผู้อ้างอิงควรมีพฤติกรรมที่คล้ายกันตามที่เห็นโดยคลาสที่พึ่งพา เป็นตัวอย่างสั้น ๆ สมมติว่าคุณมีอินเทอร์เฟซ IWriter ที่ exposes เขียน (สตริง) ซึ่งถูกนำมาใช้โดย ConsoleWriter ตอนนี้คุณต้องเขียนไปยังไฟล์แทนดังนั้นคุณจึงสร้าง FileWriter ในการทำเช่นนั้นคุณต้องตรวจสอบให้แน่ใจว่าสามารถใช้ FileWriter ได้เช่นเดียวกับที่ ConsoleWriter ทำ (หมายถึงวิธีเดียวที่ผู้พึ่งพาสามารถโต้ตอบกับมันได้โดยการเรียกการเขียน (สตริง)) และข้อมูลเพิ่มเติมที่ FileWriter อาจต้องทำ job (เช่นพา ธ และไฟล์ที่จะเขียน) ต้องจัดเตรียมจากที่อื่นนอกเหนือจากที่ขึ้นอยู่กับ
นี่เป็นเรื่องใหญ่สำหรับการเขียนโค้ดที่สามารถทดสอบได้เนื่องจากการออกแบบที่สอดคล้องกับ LSP สามารถมีวัตถุ "เยาะเย้ย" แทนของจริง ณ จุดใด ๆ โดยไม่เปลี่ยนพฤติกรรมที่คาดหวังอนุญาตให้ทดสอบชิ้นเล็ก ๆ ด้วยความมั่นใจ ว่าระบบจะทำงานกับวัตถุจริงเสียบอยู่
ฉัน - อินเตอร์เฟซแยกหลักการ: อินเตอร์เฟซที่ควรจะมีวิธีการไม่กี่เท่าเป็นไปได้เพื่อให้การทำงานของบทบาทที่กำหนดโดยอินเตอร์เฟซ เพียงแค่ใส่อินเทอร์เฟซที่เล็กลงจะดีกว่าอินเทอร์เฟซที่ใหญ่กว่าน้อยกว่า นี่เป็นเพราะอินเทอร์เฟซขนาดใหญ่มีเหตุผลในการเปลี่ยนแปลงมากขึ้นและทำให้เกิดการเปลี่ยนแปลงเพิ่มเติมในส่วนอื่นของโค้ดเบสซึ่งอาจไม่จำเป็น
การยึดมั่นใน ISP ช่วยปรับปรุงความสามารถในการทดสอบได้โดยลดความซับซ้อนของระบบภายใต้การทดสอบและการพึ่งพาของ SUT เหล่านั้น หากวัตถุที่คุณกำลังทดสอบขึ้นอยู่กับอินเทอร์เฟซ IDoThreeThings ซึ่งแสดง DoOne (), DoTwo () และ DoThree () คุณต้องจำลองวัตถุที่ใช้วิธีการทั้งสามแม้ว่าวัตถุนั้นจะใช้วิธีการ DoTwo เท่านั้น แต่ถ้าวัตถุนั้นขึ้นอยู่กับ IDoTwo เท่านั้น (ซึ่งจะเปิดเผยเฉพาะ DoTwo) คุณสามารถจำลองวัตถุที่มีวิธีการนั้นได้ง่ายขึ้น
D - พึ่งพาผกผันหลักการ: concretions และนามธรรมไม่ควรขึ้นอยู่กับ concretions อื่น ๆ แต่ในทางนามธรรม หลักการนี้บังคับใช้หลักการของการแต่งงานกันแบบหลวม ๆ โดยตรง วัตถุไม่ควรรู้ว่าวัตถุคืออะไร; มันควรจะสนใจว่าวัตถุทำอะไรแทน ดังนั้นการใช้อินเทอร์เฟซและ / หรือคลาสพื้นฐานที่เป็นนามธรรมจึงเป็นที่ต้องการมากกว่าการใช้งานที่เป็นรูปธรรมเมื่อกำหนดคุณสมบัติและพารามิเตอร์ของวัตถุหรือวิธีการ ที่ช่วยให้คุณสามารถสลับการใช้งานหนึ่งไปสู่อีกวิธีหนึ่งโดยไม่ต้องเปลี่ยนการใช้งาน (ถ้าคุณติดตาม LSP ด้วยซึ่งจับมือกับ DIP)
นี่เป็นเรื่องที่ใหญ่มากสำหรับความสามารถในการทดสอบเพราะมันช่วยให้คุณสามารถจำลองการใช้งานการอ้างอิงแทนการใช้ "การผลิต" ในวัตถุของคุณที่ถูกทดสอบอีกครั้งในขณะที่ยังคงทดสอบวัตถุในรูปแบบที่แน่นอน ในการผลิต นี่คือกุญแจสำคัญในการทดสอบหน่วย "แยก"