Vitest · Assertions พื้นฐาน
`.toContain()`
ตรวจสมาชิกใน array หรือข้อความที่อยู่ใน string
toContain()
toContain() ใช้ตรวจว่าค่าหนึ่งอยู่ใน array หรือข้อความหนึ่งเป็นส่วนย่อยของ string เหมาะเมื่อ requirement สนใจการมีสมาชิกหรือ keyword ไม่ได้ต้องการเปรียบเทียบ collection ทั้งก้อน
ใช้กับ array และ string ได้ แต่ความหมายของการมีอยู่ต่างกันตามชนิดข้อมูล
กฎสำคัญ
ตรวจ membership ไม่ใช่ deep item
ถ้า array มี object แล้วต้องตรวจโครงสร้างของ object ด้านใน ให้พิจารณา map ค่าออกมาก่อน หรือใช้ matcher ที่สื่อ intent มากกว่า
ให้ matcher ตรงกับคำถาม
เลือกวิธีตรวจจาก behavior ที่ต้องการ ไม่เลือกจากชื่อที่ดูคุ้นหรือสั้นที่สุด
แกะตัวอย่างทีละขั้น
อย่าอ่าน matcher เป็นคำสั่งเดี่ยว ให้ตามเส้นทางของข้อมูลจาก input ไป actual แล้วดูว่า matcher ตัดสิน actual อย่างไร ตารางนี้แยกสามช่วงของตัวอย่างออกจากกันเพื่อช่วยให้เริ่มอ่านได้ทีละส่วน
| ขั้น | สิ่งที่เกิดขึ้น |
|---|---|
| เตรียม collection | มีรายการ title และข้อความ status ที่ต้องค้นหา |
| กำหนดสิ่งที่ต้องมี | เลือก item หรือ keyword ที่ requirement สนใจ |
| ตรวจ membership | `.toContain(value)` ผ่านเมื่อค่าที่ค้นหาอยู่ใน array หรือ string |
ถ้าแก้ค่าตั้งต้นในตัวอย่าง ให้ถามต่อว่า toContain() ยังตรงกับคำถามเดิมหรือไม่ ตัวอย่างที่ดีไม่ได้แค่ทำให้ test ผ่าน แต่ทำให้เราเข้าใจว่ากำลังพิสูจน์ behavior ใด
ตรวจมีสมาชิกหรือเท่ากันทั้งชุด
| สถานการณ์ | วิธีคิด |
|---|---|
| ต้องมี item อยู่ใน array | toContain(item) |
| ต้องมี keyword อยู่ใน string | toContain(keyword) |
| ต้องการเทียบ array ทั้งก้อนและลำดับ | toEqual([...]) |
อย่าตรวจเกิน contract
ถ้า requirement สนใจเฉพาะ property หรือ state หนึ่งอย่าง ให้ตรวจเท่านั้น การ assert รายละเอียดที่ไม่ใช่สัญญาจะทำให้ test เปราะโดยไม่เพิ่มความมั่นใจ
แบบฝึก: เลือกและเขียน matcher
ตรวจว่ารายการ Task มี title ที่ต้องการและข้อความมี keyword
งานที่ต้องทำ
- สร้าง array ของ title สามรายการ
- ตรวจว่ามี title เขียน test
- ตรวจข้อความ status ว่ามีคำว่า completed
ลองทำด้วยตัวเองก่อน แล้วค่อยเปิดเฉลยเพื่อเทียบแนวคิดและรายละเอียด