Mocking Basics
Mock คือวิธีควบคุม dependency ภายนอกให้ test โฟกัสกับสิ่งที่ต้องการพิสูจน์ โดยไม่ต้องพึ่งพาระบบจริงทุกตัวในทุกครั้ง
Mock เป็นเครื่องมือ ไม่ใช่เป้าหมาย
เราไม่ได้ mock เพื่อให้ test ดูเก่งขึ้น แต่ mock เพื่อแยกสิ่งรบกวนและควบคุมเงื่อนไขที่ทดสอบได้ยาก
ทำไมต้องมี mock
บางครั้งสิ่งที่เราทดสอบต้องพึ่ง API, เวลา, payment service หรือ service ภายนอกอื่น ๆ ซึ่งช้า เปลี่ยนแปลงได้ หรือควบคุมผลลัพธ์ยาก การใช้ mock ช่วยให้ test เสถียรและโฟกัสกับขอบเขตที่ตั้งใจจะตรวจ
Point 1
mock API เพื่อกำหนด response ที่แน่นอน
Point 2
mock clock เพื่อควบคุมเวลาใน test
Point 3
mock payment service เพื่อไม่ต้องเรียกของจริงทุกครั้ง
ข้อควรระวังของการ mock
ถ้า mock มากเกินไป test อาจเริ่มผูกกับวิธี implement ภายใน จนสุดท้ายผ่านทั้งที่ระบบจริงทำงานไม่เหมือนที่คาด
- อย่า mock ทุกอย่างจน test ไม่แตะ behavior จริงเลย
- หลีกเลี่ยงการ assert รายละเอียดภายในที่ไม่ใช่ contract สำคัญ
- ถ้า dependency จริงไม่ใช่ปัญหา ควรพิจารณาใช้ของจริงในระดับ test ที่เหมาะกว่า
หลักคิดเวลาเลือกใช้ mock
เริ่มจากคำถามว่า test นี้อยากพิสูจน์อะไร แล้ว mock เฉพาะ dependency ที่ทำให้เราควบคุมสถานการณ์ไม่ได้หรือทำให้ test ช้า เปราะ และอ่านยากเกินไป
- mock เท่าที่จำเป็น
- ให้ความสำคัญกับ contract มากกว่า implementation detail
- ใช้ mock เพื่อเพิ่มความชัด ไม่ใช่เพื่อซ่อนปัญหาโครงสร้างโค้ด