[Golang]สร้าง Mock โดยใช้ package Testify
ในภาษา Golang มี package หนึ่งที่ใช้สำหรับการเขียนเทสทำให้เราสะดวกสบายมากขึ้นและ package ที่ว่านั้นคือ Testify ซึ่งสามารถทำได้หลายอย่างไม่ว่าจะเป็น assert, require, mock, suite ซึ่งในที่นี้จะพูดถึง mock
Mock คืออะไร?
mock คือ การจำลองฟังก์ชัน หรือ mathod ขึ้นมา ให้ retrun ค่าเดิมต้องการทุกครั้งในการเรียกใช้ฟังก์ชัน และ mock เป็นหนึ่งในเทคนิคทำให้เราเทสฟังก์ชันหรือ mathod ได้ง่าย
ทำไมต้องทำ Mock
ทำ mock เพราะเราไม่สามารถคาดการณ์หรือควบคุมพฤติกรรมจาก real ฟังก์ชันหรือ real mathod ได้
- real ฟังก์ชันใช้ callback
- real ฟังก์ชันนั้นสร้างอยาก หรือ กำหนดค่าขึ้นมาได้อยาก
- real ฟังก์ชันต้องต่อกับ database ซึ่งเราไม่ต้องการจะใช้งาน database จริงๆ
- ทำให้เขียน unit test ได้ง่าย
ตัวอย่าง
เราต้องการจะเขียนเทสฟังก์ชันGetCustomerName
ซึ่งเป็นฟังก์ชันที่อยู่ layer API ที่ต้องไปเรียกฟังก์ชัน GetCustomerByID
ที่มีการดึงข้อมูลมาจาก database ซึ่งเราไม่ต้องการจะต่อกับ database จริงๆเราจึงจะ mock GetCustomerByID
ขึ้นมา
1. เขียน test ของฟังก์ชัน GetCustomerName()
ส่วนแรก กำหนดว่าถ้าเรียกใช้ GetCustomerName()
ที่ input id เป็น 12 จะได้ Smalldog กลับมา ต่อมาสร้าง Object CustomerRepoMock
แล้วบรรทัดที่ 13 เป็นการกำหนดว่าจะ Mock ฟังก์ชันอะไร โดย syntax เป็น
customerRepoMock.On('ชื่อฟังก์ชัน',input).Retuen('return ค่าที่ 1','return ค่าที่ 2')
ในที่นี้เราจะ Mock GetCustomerByID
Input id เป็น 12 และมีการ retrun 2 ค่าเป็น Smalldog และ error ที่เป็น nil
อีกส่วนคือ customerRepoMock.AssertExpectations(t)
เป็นการเช็คว่าใน Mock มีการส่งค่ามาถูกต้องหรือไม่
2. เขียนฟังก์ชัน GetCustomerName()
และ Mock GetcutomerByID
สร้าง interface ของ Customer
ที่มี method GetcustomerByID(int)(string,error)
ที่รับ id และ return string กับ error เพื่อให้เราสร้างทำ Mock ของ GetcustomerByID()
ได้
สร้างฟังก์ชัน GetCustomerName()
ที่มีการเรียกใช้ GetcustomerByID()
ถ้ามี error จะ return empty และ error
สร้าง GetCustomerByID()
ที่เป็น method ของ CustomerRepoMock
ที่เหมือนกับ interface Curomer
โดย
m.Called(id) คือการตรวจสอบว่าค่าของ parameter ส่งมาตรงตามที่เรากำหนดใว้ในเทสหรือไม่ ในที่นี้เรากำหนดให้เป็น 12 ถ้า id ไม่ไช่ 12 ฟังก์ชัน Mock จะโชว์ error ที่บรรทัด 19 ในเทสที่อยู่ใน .On(“GetcustomerById”,12)
argument.String(0) คือ return ค่าที่เรากำหนดไว้ในเทส argument ตัวแรกจาก .Retrun(“Smalldog”,nil) ที่เป็น type string และ argument.Error(1) ก็เหมือนกันที่เป็น type error