คำถามที่น่าสนใจ สำหรับการพัฒนาและทดสอบระบบงาน
หนึ่งในนั้นคือ เราควรจะ Mock หรือ ไม่ Mock พวก dependency ดี ?
เป็นคำถามที่ตอบได้ยากมาก ๆ
เนื่องจากมันขึ้นอยู่กับ context ที่พบเจอด้วย
แต่สิ่งที่เราควรต้องตอบให้ได้ว่า
เราจะ Mock พวก dependency ต่าง ๆ ไปทำไม
เพราะว่าใช้ของจริงไปเลยสิ มันจริงกว่า ถูกต้องกว่า !!

ก่อนอื่นแนะนำให้เข้าใจก่อนว่า Mock มันคือ

หนึ่งในรูปแบบหนึ่งของการจำลอง dependency
ซึ่งเราจะเรียกว่า Test Double มีทั้ง

  • Dummy
  • Stub
  • Spy
  • Mock
  • Fake

มีเป้าหมายเพื่อทดสอบการทำงานในส่วนที่สนใจ
โดยที่สามารถกำหนดสถานการณ์ หรือ หรือจำลองผลการทำงานของ dependency
ให้เป็นไปตามที่เราต้องการ ทั้ง success และ fail
โดยสามารถใช้งานได้ในการทดสอบแต่ละชนิดด้วย เช่น

  • Unit test
  • API test
  • UI test

ผลที่ตามมาคือ เราสามารถทดสอบการทำงานในแต่ละส่วนได้รวดเร็วขึ้น
การทดสอบสามารถทำซ้ำ ๆ ได้บ่อยตามที่เราต้องการ

แต่ถ้าทำการจำลอง dependency มากเกินไป
หรือลงรายละเอียดมากไป
ก็จะทำให้เกิดปัญหาได้ ลองอ่านเพิ่มเติมได้ที่ Mocking is a code smell

เนื่องจากการจำลองมันก่อให้เกิดปัญหาดังนี้

  • มักจะมีสิ่งที่เพิ่มเข้ามาในการจำลองมากกว่าของจริง เช่น property/method เป็นต้น
  • ทำการ return ข้อมูลต่างจากของจริง
  • มีการทำงานที่แตกต่างจากของจริง
  • หนักกว่านั้น เมื่อของจริงมีการเปลี่ยนแปลง ในส่วนของการจำลองไม่เป็น ปัญหาเกิดแน่นอน
  • ยิ่งมี dependency มาก ๆ ยิ่งทรมาน ดังนั้นควรกลับไปดูการออกแบบแล้ว ว่าทำไมมี dependency เยอะแบบนั้น

ดังนั้นอาจจะต้องดูด้วยว่า สิ่งที่เราต้องการคืออะไรกันแน่

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

ยกตัวอย่างเช่น

เราสนใจที่ business logic เป็นหลัก เนื่องจากมีความซับซ้อน
ดังนั้นจึงพยายามที่จะจำลอง dependency ที่ถูกใช้งาน
เช่น database, external api เป็นต้น
แต่ถ้าสามารถทดสอบกับระบบจริง ๆ ได้หรือบ่อยที่สุด จะเป็นสิ่งที่ดีที่สุด

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