Vitest · Assertions พื้นฐาน
`.toBeNull()`
ตรวจค่าที่ควรเป็น `null` โดยเฉพาะ
toBeNull()
toBeNull() ตรวจเฉพาะค่า null ไม่รวม undefined, false, 0 หรือสตริงว่าง ใช้เมื่อ domain ตั้งใจใช้ null เป็นสัญญาณว่ามีช่องว่างหรือไม่พบข้อมูล
แสดง contract ที่ตั้งใจคืน null เมื่อไม่พบข้อมูล
กฎสำคัญ
ตรวจค่าที่ domain เลือกใช้
อย่าเปลี่ยน null และ undefined ให้เป็นคำเดียวกันใน test เพราะสองค่านี้บอก contract คนละแบบ
ให้ matcher ตรงกับคำถาม
เลือกวิธีตรวจจาก behavior ที่ต้องการ ไม่เลือกจากชื่อที่ดูคุ้นหรือสั้นที่สุด
แกะตัวอย่างทีละขั้น
อย่าอ่าน matcher เป็นคำสั่งเดี่ยว ให้ตามเส้นทางของข้อมูลจาก input ไป actual แล้วดูว่า matcher ตัดสิน actual อย่างไร ตารางนี้แยกสามช่วงของตัวอย่างออกจากกันเพื่อช่วยให้เริ่มอ่านได้ทีละส่วน
| ขั้น | สิ่งที่เกิดขึ้น |
|---|---|
| กำหนด contract | `getSelectedTask` ใช้ `null` แทนกรณีไม่พบข้อมูล |
| สร้างกรณีขอบ | ส่งรายการว่างและ id ที่ไม่มีอยู่ |
| ตรวจค่าพิเศษ | `.toBeNull()` ยืนยันว่าเป็น `null` โดยเฉพาะ ไม่ใช่ falsy ค่าอื่น |
ถ้าแก้ค่าตั้งต้นในตัวอย่าง ให้ถามต่อว่า toBeNull() ยังตรงกับคำถามเดิมหรือไม่ ตัวอย่างที่ดีไม่ได้แค่ทำให้ test ผ่าน แต่ทำให้เราเข้าใจว่ากำลังพิสูจน์ behavior ใด
null ไม่ใช่ undefined
| สถานการณ์ | วิธีคิด |
|---|---|
| ฟังก์ชันสัญญาว่าคืน null เมื่อไม่พบ | toBeNull() |
| property อาจไม่มีอยู่ใน object | toBeUndefined() |
| ไม่สนใจว่าเป็นค่าใด ขอแค่ไม่มีสถานะ | toBeFalsy() |
อย่าตรวจเกิน contract
ถ้า requirement สนใจเฉพาะ property หรือ state หนึ่งอย่าง ให้ตรวจเท่านั้น การ assert รายละเอียดที่ไม่ใช่สัญญาจะทำให้ test เปราะโดยไม่เพิ่มความมั่นใจ
แบบฝึก: เลือกและเขียน matcher
ตรวจ function ที่คืน null เมื่อรายการไม่มี Task
งานที่ต้องทำ
- สร้าง function getSelectedTask ที่คืน null เมื่อไม่พบ
- เรียกด้วยรายการว่าง
- ใช้ toBeNull ตรวจผลลัพธ์
ลองทำด้วยตัวเองก่อน แล้วค่อยเปิดเฉลยเพื่อเทียบแนวคิดและรายละเอียด