Vitest · Assertions พื้นฐาน
`.toBeUndefined()`
ตรวจค่าที่ควรเป็น `undefined` เช่น optional property
toBeUndefined()
toBeUndefined() ตรวจเฉพาะค่า undefined มักใช้กับ optional property หรือ function ที่ไม่มีผลลัพธ์เมื่อค้นหาไม่พบ การตรวจแบบเฉพาะเจาะจงช่วยป้องกันการสับสนกับ null ซึ่งเป็นอีก contract หนึ่ง
find() คืน undefined เมื่อไม่พบสมาชิกใน array
กฎสำคัญ
undefined บอกว่ายังไม่มีค่า
อ่าน return type และ contract ของ function ก่อนเลือก matcher อย่าเดาจากคำว่า “ไม่พบ” เพียงอย่างเดียว
ให้ matcher ตรงกับคำถาม
เลือกวิธีตรวจจาก behavior ที่ต้องการ ไม่เลือกจากชื่อที่ดูคุ้นหรือสั้นที่สุด
แกะตัวอย่างทีละขั้น
อย่าอ่าน matcher เป็นคำสั่งเดี่ยว ให้ตามเส้นทางของข้อมูลจาก input ไป actual แล้วดูว่า matcher ตัดสิน actual อย่างไร ตารางนี้แยกสามช่วงของตัวอย่างออกจากกันเพื่อช่วยให้เริ่มอ่านได้ทีละส่วน
| ขั้น | สิ่งที่เกิดขึ้น |
|---|---|
| เตรียมรายการ | มี Task id 1 แต่ไม่มี id 99 |
| ค้นหา id ที่หายไป | `findTask(tasks, 99)` ทำให้ `Array.find` คืน `undefined` |
| ตรวจ contract | `.toBeUndefined()` ยืนยันชนิดผลลัพธ์ที่ไม่มีค่าแบบนี้โดยตรง |
ถ้าแก้ค่าตั้งต้นในตัวอย่าง ให้ถามต่อว่า toBeUndefined() ยังตรงกับคำถามเดิมหรือไม่ ตัวอย่างที่ดีไม่ได้แค่ทำให้ test ผ่าน แต่ทำให้เราเข้าใจว่ากำลังพิสูจน์ behavior ใด
เลือก matcher ให้ตรงกับชนิดผลลัพธ์
| สถานการณ์ | วิธีคิด |
|---|---|
| Array.find ไม่พบ item | toBeUndefined() |
| API ตั้งใจคืน null | toBeNull() |
| ต้องตรวจว่า property มีค่าใด ๆ | toBeDefined() หรือ matcher ที่เฉพาะกว่า |
อย่าตรวจเกิน contract
ถ้า requirement สนใจเฉพาะ property หรือ state หนึ่งอย่าง ให้ตรวจเท่านั้น การ assert รายละเอียดที่ไม่ใช่สัญญาจะทำให้ test เปราะโดยไม่เพิ่มความมั่นใจ
แบบฝึก: เลือกและเขียน matcher
ตรวจผลลัพธ์ของ findTask เมื่อใช้ id ที่ไม่มีในรายการ
งานที่ต้องทำ
- เตรียม Task ที่มี id 1
- ค้นหาด้วย id 99
- ตรวจผลลัพธ์ด้วย toBeUndefined
ลองทำด้วยตัวเองก่อน แล้วค่อยเปิดเฉลยเพื่อเทียบแนวคิดและรายละเอียด