Vitest · Async Tests
`.rejects`
ตรวจ Promise ที่ reject และ error behavior ของ async function
rejects ตรวจ Promise ที่ล้มเหลว
rejects ทำงานคู่กับ Promise ที่ reject โดยเปิดเหตุผลของการ reject ให้ matcher ตรวจได้ เช่น error message หรือ error type ถ้า Promise resolve สำเร็จแทน assertion rejects test จะ fail เพราะ behavior ไม่ตรงกับ failure path ที่กำหนด
กฎสำคัญ
rejects ใช้กับ Promise
สำหรับ synchronous function ที่ throw ให้ใช้ toThrow โดยส่ง function wrapper แทน
ตรวจ failure behavior ที่มีความหมาย
ตรวจ code หรือ message ที่เป็น contract ไม่จำเป็นต้อง assert รายละเอียด stack trace
ลำดับของ rejected Promise
เมื่อเรียก saveTask("") function ไม่ได้ throw ออกมาเป็น synchronous value ให้เราจับทันที แต่คืน Promise ที่อยู่ในสถานะ rejected ดังนั้น test ต้องส่ง Promise เข้า expect แล้วใช้ rejects เปิดเหตุผลของการ reject ออกมาตรวจ
toThrow กับ rejects.toThrow
| กรณี | รูปแบบ |
|---|---|
| function ธรรมดา throw ทันที | expect(() => requireTitle("")).toThrow(...) |
| async function คืน rejected Promise | await expect(saveTask("")).rejects.toThrow(...) |
| async function คืนค่าปกติ | await expect(loadTask(1)).resolves.toEqual(...) |
ดูชนิดของผลลัพธ์ก่อนเลือก matcher
ความต่างสำคัญไม่ใช่แค่ชื่อ matcher แต่คือ error เกิด synchronously หรืออยู่ใน Promise ที่ต้องรอ
แบบฝึก: ตรวจ async failure
เขียน test ให้ผ่านเมื่อ saveTask reject ด้วย TITLE_REQUIRED
งานที่ต้องทำ
- ทำ callback เป็น async
- ใช้ rejects.toThrow
- await assertion chain ให้ครบ
ลองทำด้วยตัวเองก่อน แล้วค่อยเปิดเฉลยเพื่อเทียบแนวคิดและรายละเอียด