Vitest · Assertions พื้นฐาน
`.not`
กลับเงื่อนไขของ matcher เพื่อยืนยันสิ่งที่ไม่ควรเกิดขึ้น
not
not กลับเงื่อนไขของ matcher เช่น expect(task.completed).not.toBe(true) หมายถึงสถานะต้องไม่เป็น true ใช้เมื่อ negative behavior เป็นส่วนหนึ่งของ contract จริง ไม่ใช่ใช้เพื่อทำให้ test ผ่านง่ายขึ้น
ต่อ not ก่อน matcher ที่ต้องการกลับเงื่อนไข
กฎสำคัญ
not ไม่ใช่ทางลัด
negative assertion ที่กว้างเกินไปอาจผ่านเมื่อค่าเป็น null, undefined หรือค่าผิดชนิด จึงใช้เมื่อสิ่งที่ “ไม่ควรเกิด” เป็น behavior ที่ต้องรักษา
ให้ matcher ตรงกับคำถาม
เลือกวิธีตรวจจาก behavior ที่ต้องการ ไม่เลือกจากชื่อที่ดูคุ้นหรือสั้นที่สุด
แกะตัวอย่างทีละขั้น
อย่าอ่าน matcher เป็นคำสั่งเดี่ยว ให้ตามเส้นทางของข้อมูลจาก input ไป actual แล้วดูว่า matcher ตัดสิน actual อย่างไร ตารางนี้แยกสามช่วงของตัวอย่างออกจากกันเพื่อช่วยให้เริ่มอ่านได้ทีละส่วน
| ขั้น | สิ่งที่เกิดขึ้น |
|---|---|
| สร้างค่าจริง | สร้าง Task ใหม่ที่ยังไม่ completed |
| เลือกสิ่งที่ห้ามเกิด | กำหนดว่า completed ต้องไม่เป็น true และ title ต้องไม่มีคำต้องห้าม |
| กลับเงื่อนไข | `.not` ทำให้ matcher ถัดไปตรวจด้านตรงข้าม แต่ยังต้องระบุ contract ให้ชัด |
ถ้าแก้ค่าตั้งต้นในตัวอย่าง ให้ถามต่อว่า not ยังตรงกับคำถามเดิมหรือไม่ ตัวอย่างที่ดีไม่ได้แค่ทำให้ test ผ่าน แต่ทำให้เราเข้าใจว่ากำลังพิสูจน์ behavior ใด
negative assertion ที่มีความหมาย
| สถานการณ์ | วิธีคิด |
|---|---|
| ต้องไม่เป็นสถานะ completed | not.toBe(true) |
| ต้องไม่อยู่ในรายการต้องห้าม | not.toContain(value) |
| ถ้าจริง ๆ ต้องเป็น false เท่านั้น | toBe(false) อธิบาย contract ได้แคบกว่า |
อย่าตรวจเกิน contract
ถ้า requirement สนใจเฉพาะ property หรือ state หนึ่งอย่าง ให้ตรวจเท่านั้น การ assert รายละเอียดที่ไม่ใช่สัญญาจะทำให้ test เปราะโดยไม่เพิ่มความมั่นใจ
แบบฝึก: เลือกและเขียน matcher
เขียน negative assertion ให้กับ Task ใหม่
งานที่ต้องทำ
- สร้าง Task ใหม่
- ตรวจว่า completed ไม่เป็น true
- ตรวจว่า title ไม่มีคำต้องห้าม
ลองทำด้วยตัวเองก่อน แล้วค่อยเปิดเฉลยเพื่อเทียบแนวคิดและรายละเอียด