[Golang]สร้าง Mock โดยใช้ package Testify

Smalldog124
1 min readApr 8, 2019

--

ในภาษา 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

--

--

No responses yet