Vitest · Async Tests
Async Failure ที่พบบ่อย
รู้จักข้อผิดพลาดจากการลืม `await` หรือเลือก assertion ผิดกับ Promise
Async test ที่ดูเหมือนผ่านแต่ตรวจไม่ครบ
ข้อผิดพลาดที่พบบ่อยคือเรียก async function แล้วไม่ await assertion หรือใช้ matcher ของค่าปกติกับ Promise ผลคือ test อาจจบก่อน failure เกิด หรือกำลังตรวจ object คนละชนิดกับที่คิดไว้ จึงเกิด false positive ได้
รูปแบบที่สองทำให้จังหวะรอและจังหวะตรวจเห็นได้ชัดเจน
กฎสำคัญ
หา Promise ให้เจอ
ดู return type หรือ implementation ว่า function คืน Promise หรือไม่ ก่อนเลือก syntax ของ test
await assertion chain
resolves และ rejects คืน assertion แบบ Promise จึงต้อง await ทั้ง chain
ทดสอบ failure path ด้วย
async code ไม่ได้มีแค่ success การ reject และการลืมรอก็ควรถูก review
ใช้ checklist ตรวจ test ของตัวเอง
ก่อนสรุปว่า async test ผ่าน ให้ชี้ให้ได้ว่า Promise ถูกสร้างตรงไหน, test รอตรงไหน และ assertion ตรวจค่าหลัง resolve หรือเหตุผลหลัง reject ตรงไหน ถ้าชี้สามจุดนี้ไม่ได้ แปลว่ายังมีโอกาสที่ test จะผ่านโดยไม่ตรวจ behavior จริง
การเขียน comment ช่วยตอนเริ่มต้น เมื่ออ่านคล่องแล้วจึงค่อยลด comment ที่ไม่จำเป็นได้
Checklist เวลา review async test
| คำถาม | ถ้าคำตอบคือใช่ |
|---|---|
| function คืน Promise ไหม | ทำ callback ให้ async หรือคืน Promise อย่างชัดเจน |
| ใช้ resolves/rejects ไหม | ตรวจว่ามี await หน้า assertion chain |
| มี failure path ไหม | เพิ่ม test สำหรับ rejected Promise ตาม contract |
| ค่าที่ตรวจเป็นผลลัพธ์จริงไหม | อย่าตรวจ Promise object แทนค่าที่ resolve |
อย่าแก้ด้วยการใส่ await แบบไม่อ่าน flow
await ต้องอยู่ตรงจุดที่ทำให้ Act เสร็จก่อน Assert ถ้าการวางตำแหน่งยังไม่ชัด ให้แยกตัวแปรกลางและใช้ AAA
แบบฝึก: แก้ false positive
แก้ test ที่ไม่รอ Promise ให้ตรวจค่าชื่อ Task หลัง loadTask เสร็จ
งานที่ต้องทำ
- ทำ callback เป็น async
- await ผลจาก loadTask
- ใช้ toBe ตรวจ title ของค่าที่ resolve แล้ว
ลองทำด้วยตัวเองก่อน แล้วค่อยเปิดเฉลยเพื่อเทียบแนวคิดและรายละเอียด