Vitest · Assertions พื้นฐาน
`.toBe()`
ตรวจ primitive หรือค่าที่ต้องตรงกันแบบ exact
toBe()
toBe() ใช้ตรวจ primitive value ที่ควรเท่ากันแบบ exact และใช้ตรวจว่า object สองตัวเป็น reference เดียวกันได้ มันเหมาะกับ boolean, number, string และสถานะเล็ก ๆ ที่ต้องตรงกันโดยตรง
กฎสำคัญ
exact value ต้องตรงจริง
toBe ใช้ Object.is ในการตัดสินค่าพื้นฐาน จึงไม่ควรใช้กับ floating point ที่อาจมีความคลาดเคลื่อนจากการคำนวณ
ให้ matcher ตรงกับคำถาม
เลือกวิธีตรวจจาก behavior ที่ต้องการ ไม่เลือกจากชื่อที่ดูคุ้นหรือสั้นที่สุด
แกะตัวอย่างทีละขั้น
อย่าอ่าน matcher เป็นคำสั่งเดี่ยว ให้ตามเส้นทางของข้อมูลจาก input ไป actual แล้วดูว่า matcher ตัดสิน actual อย่างไร ตารางนี้แยกสามช่วงของตัวอย่างออกจากกันเพื่อช่วยให้เริ่มอ่านได้ทีละส่วน
| ขั้น | สิ่งที่เกิดขึ้น |
|---|---|
| เตรียมข้อมูล | สร้าง Task ที่มี id และ title ตาม input |
| เลือก actual | หยิบ `task.completed` และ `task.title` ซึ่งเป็นค่าพื้นฐานออกมาตรวจ |
| ตัดสินแบบ exact | `.toBe(expected)` ตรวจว่าค่าจริงตรงกับค่าที่ระบุทุกประการ |
ถ้าแก้ค่าตั้งต้นในตัวอย่าง ให้ถามต่อว่า toBe() ยังตรงกับคำถามเดิมหรือไม่ ตัวอย่างที่ดีไม่ได้แค่ทำให้ test ผ่าน แต่ทำให้เราเข้าใจว่ากำลังพิสูจน์ behavior ใด
toBe ไม่ได้เปรียบเทียบโครงสร้าง object
| สถานการณ์ | วิธีคิด |
|---|---|
| boolean, number, string | ใช้ toBe เมื่อค่าต้องตรงกันโดยตรง |
| object หรือ array ที่มีค่าข้างในเท่ากัน | ใช้ toEqual เพื่อเปรียบเทียบโครงสร้าง |
| object reference เดียวกัน | ใช้ toBe ได้เมื่อกำลังตรวจ identity จริง ๆ |
อย่าตรวจเกิน contract
ถ้า requirement สนใจเฉพาะ property หรือ state หนึ่งอย่าง ให้ตรวจเท่านั้น การ assert รายละเอียดที่ไม่ใช่สัญญาจะทำให้ test เปราะโดยไม่เพิ่มความมั่นใจ
แบบฝึก: เลือกและเขียน matcher
เติม assertion ที่ตรวจผลลัพธ์ของ createTask โดยไม่ตรวจ implementation detail
งานที่ต้องทำ
- ตรวจ id เป็น 7 ด้วย toBe
- ตรวจ completed เริ่มต้นเป็น false ด้วย toBe
- ตรวจ title เป็นข้อความที่ส่งเข้าไป
ลองทำด้วยตัวเองก่อน แล้วค่อยเปิดเฉลยเพื่อเทียบแนวคิดและรายละเอียด