Vitest · Async Tests
`await` ใน Test
รอ Promise ให้เสร็จก่อนจึงตรวจผลลัพธ์
await คือจุดที่หยุดรอผลลัพธ์
await ทำให้โค้ดใน async function รอ Promise ให้ settle ก่อนจึงไปบรรทัดถัดไป ใน test เราจึงใช้ await ระหว่าง Act กับ Assert เพื่อไม่ให้ assertion ตรวจ Promise object หรือค่าที่ยังมาไม่ถึง
หลัง await ตัวแปร task เป็นค่าที่ Promise resolve แล้ว ไม่ใช่ Promise ตัวเดิม
| รูปแบบ | ความหมาย |
|---|---|
| expect(loadTask(1)).toEqual(...) | กำลังส่ง Promise เข้า matcher ของ value |
| expect(await loadTask(1)).toEqual(...) | รอแล้วจึงตรวจค่าที่ resolve |
| const task = await loadTask(1) | แยก Act ให้เห็นชัดและ debug ง่าย |
ก่อน await กับหลัง await เป็นคนละชนิดค่า
ก่อน await ตัวแปรที่ได้จาก async function คือ Promise ซึ่งเป็นเหมือนใบรับของที่บอกว่า “ผลลัพธ์จะมา” ส่วนหลัง await จึงได้ Task ที่นำ property อย่าง id หรือ title ไปตรวจได้
ความเข้าใจเรื่องชนิดของค่าช่วยอธิบายว่าทำไม expect(loadTask(1)) จึงไม่เหมือน expect(await loadTask(1))
แบบฝึก: วาง await ให้ถูกจุด
เปลี่ยน test ให้รอ loadTask ก่อนตรวจผลลัพธ์
งานที่ต้องทำ
- ทำ callback เป็น async
- วาง await หน้า loadTask
- ตรวจ title ที่ได้กลับมา
ลองทำด้วยตัวเองก่อน แล้วค่อยเปิดเฉลยเพื่อเทียบแนวคิดและรายละเอียด