Test function ที่มี dependency แต่ไม่ได้ออกแบบเป็น interface
ในภาษา Go ถ้าต้องการ mock function เพื่อ test เราจำเป็นจะต้องออกแบบ function ที่ต้องการจะ mock ให้อยู่ภายใต้ interface
แต่ถ้า code ที่ต้องการจะ test เป็น code รุ่นเก่าที่ไม่ได้ออกแบบมาเพื่อ test และไม่สามารถแก้ parameter เพื่อส่ง mock interface ได้เพราะมีคนอื่นเรียกอยู่
คำถามคือ “เราจะ mock function นั้นได้อย่างไร”
ผมมีเทคนิคเล็กๆสำหรับแก้ปัญหานี้ครับ
ตัวอย่าง Function ที่ต้องการ test
จาก code จะเห็นว่าจุดที่จำเป็นต้อง mock คือ “http.Get” วิธี mock คือ
ทำ “http.Get” เป็น variable ซะ และเรียกผ่าน variable นั้นแทน
จาก code ที่แก้ จะไม่มีผลกับการทำงานของโปรแกรมเดิม
เขียน Test
จาก test บรรทัดที่ 12–16 คือ การ mock “http.Get” ด้วยการเปลี่ยนค่าของ variable “httpGet” ซะ และ mock response ที่ต้องการ ก่อนที่ โปรแกรมจะ execute
เท่านี้ก็สามารถ run test ด้วยการ mock function ได้แล้ว
ถ้าเรามี testcase มากกว่า 1 case และกลัวว่าค่าของ “httpGet” จะโดนเปลี่ยน ให้ใส่ defer เพื่อ คืนให้เดิมของ “httpGet” ซะ