Skip to content

Node.js | Test doubles ด้วย Sinon.js

การทำ unit test คือการทดสอบโค้ดโดยไม่สน dependencies ภายนอกอย่างเช่น database CRUD, Web services, APIs เพราะ unit test คือการทดสอบแค่การทำงานของฟังก์ชันนั้นๆ ว่าเป็นไปตาม flow ทำงานได้ถูกต้องตาม logic หรือไม่ เพื่อเป็นการลดความยุ่งยากเราจึงต้องจำลองการทำงานของโค้ดส่วนที่มีการติดต่อกับภายนอก

“Test-doubles” คือการสร้าง “ตัวแทน” (เพราะงี้ถึงเรียกว่า double) ของการทำงานภายนอก เสมือนว่ามีการเรียกใช้งานส่วนนั้นจริงๆ เพื่อป้องการ side-effect ที่อาจจะเกิดขึ้น ส่วนผลพลอยได้คือการรันชุดทดสอบได้เร็วขึ้นเพราะไม่ต้องติดต่อออกไปภายนอก

สำหรับ Node.js ก็มี Sinon.js ที่ช่วยทำ test-doubles ใช้ร่วมกับ test framework อย่าง Mocha, Jasmine ได้ ความจริงมีหลายตัวเลือกใช้กันได้ตามสะดวก sinon.js นั้นติดตั้งผ่าน npm ได้เลย

ยกตัวอย่างผมคลาสชื่อ DB คลาสนี้สามารถเขียนและอ่านข้อมูลจาก database ได้

สำหรับใครที่เขียน unit test จะได้ยินคำว่า mock ซึ่งเป็นการเรียกแบบรวมๆ ถึงการจำลองการทำงานของโค้ดภายนอก การจำลองพฤติกรรมของ function แยกย่อยได้เป็น 3  แบบคือ Spy, Stub และ Mock แล้วมันต่างกันยังไง ตอนไหนเราจะใช้อะไรล่ะ?

Spy

เป็นการติดตามดูสถิติ ติดตามการทำงานของ function ภายใน function ที่เราต้องการทดสอบว่าถูกเรียกกี่ครั้ง ด้วย parameter อะไรบ้าง ตัวอย่างการใช้ spy ก็ตามนี้

โค้ดข้างบนคือการทดสอบว่า save() ถูกเรียกอย่างน้อย 1 ครั้ง

Stub

ในกรณีที่เราต้องการจำลองการคืนค่าของ method หรือ function ให้ใช้ stub แทน ยกตัวอย่างผมมีคลาส Document ที่เรียกใช้ get() ของคลาส DB

ผมไม่ต้องการต่อ database จริงๆ ก็เลย stub เพื่อจำลองผลลัพธ์ที่จะคืนกลับมาตามนี้

Mock

การใช้งาน mock จะใช้เมื่อเราต้องการการทำงานทั้ง spy และ stub คือต้องการทั้งสถิติและจำลองผลลัพธ์จาก dependency ภายนอก เราไม่สามารถ spy และ stub method พร้อมกันได้

การใช้งาน mock เป็นการ verify ว่า method นั้นทำงานตามที่เราคาดหวังหรือเปล่าถ้าเป็นไปตามที่คาดหวัง test ก็จะผ่าน ถ้าไม่เป็นไปตามที่เราคาดหวัง test นั้นจะ fail

ส่วนการใช้งาน Sinon แบบอื่นๆ สามารถดูตาม Sinon Document ได้เลยครับ เขียนไว้ละเอียดและมีตัวอย่างโค้ดให้ดูด้วย

Be First to Comment

Leave a Reply

Your email address will not be published.