Supertest · เริ่มต้นกับ Supertest
Supertest, Jest และ NestJS ทำหน้าที่ต่างกันอย่างไร
แยกบทบาทของ request library, test runner และ NestJS testing utilities
แยกบทบาทของ Supertest, Jest และ NestJS
ใน test file เดียวกันเรามักเห็น Supertest, Jest และ NestJS อยู่ด้วยกันจนรู้สึกว่าเป็นเครื่องมือชิ้นเดียวกัน แต่แต่ละตัวตอบคำถามคนละข้อ: ใครส่ง request, ใครรัน test และใครประกอบ application ให้พร้อมรับ request
| เครื่องมือ | หน้าที่หลัก | ตัวอย่างในโค้ด |
|---|---|---|
| Supertest | สร้าง HTTP request และอ่าน response | `request(server).get(...)` |
| Jest | ค้นหา/รัน test, จัด lifecycle และทำ assertion | `describe`, `it`, `expect`, `beforeAll` |
| NestJS Testing | สร้าง TestingModule และ application สำหรับ test | `Test.createTestingModule(...)` |
ถ้าเปลี่ยนเครื่องมือหนึ่งตัว คำถามที่มันรับผิดชอบก็เปลี่ยนไปด้วย เช่น เปลี่ยนจาก Jest เป็น test runner ตัวอื่น อาจต้องเปลี่ยน `describe` หรือ lifecycle แต่การเรียก `request(server).get(...)` ยังคงเป็นความรับผิดชอบของ Supertest
อ่าน test หนึ่งข้อจากบนลงล่าง
ให้สังเกตว่า Supertest ไม่ได้ตัดสินว่า test นี้ชื่ออะไร และ Jest ไม่ได้เป็นผู้สร้าง route ของ NestJS
| ขั้นตอน | คำถามที่ควรถาม | ผู้รับผิดชอบหลัก |
|---|---|---|
| จัดกลุ่มและเริ่ม test | test นี้กำลังพิสูจน์ behavior อะไร | Jest |
| ส่ง request | method, path และ input ถูกส่งอย่างไร | Supertest |
| รับ request จริงใน runtime | route และ dependency ถูกประกอบไว้หรือยัง | NestJS application |
| ตรวจ response | status/body ตรงกับ contract หรือไม่ | Jest assertion |
โค้ด setup อย่าง `Test.createTestingModule(...)`, `createNestApplication()` และ `app.init()` เป็นเรื่องของการเตรียม test harness ซึ่งจะเรียนเป็นขั้นตอนใน phase ถัดไป หน้านี้ต้องการให้แยกบทบาทก่อน เพื่อไม่สับสนระหว่างการประกอบ app กับการส่ง request
วิเคราะห์ failure จากชั้นที่รับผิดชอบ
เมื่อ test fail อย่าเพิ่งสรุปว่า Supertest เสีย ให้ดูว่าความผิดพลาดเกิดที่ชั้นใดก่อน การแยกบทบาททำให้เราแก้ตรงจุดและไม่เปลี่ยน assertion เพื่อกลบปัญหาใน application
| อาการ | สิ่งที่ควรตรวจเป็นอันดับแรก | ชั้นที่น่าจะเกี่ยวข้อง |
|---|---|---|
| runner ไม่พบ test | ชื่อไฟล์และ configuration ของ test | Jest |
| ได้ `404` ทั้งที่คาดว่า route มีอยู่ | method และ path ตรงกับ route หรือไม่ | Supertest request + NestJS route |
| ได้ `500` | application log และ dependency ระหว่าง request | NestJS runtime หรือ feature code |
| status ถูกแต่ body ไม่ตรง | response contract และ expected value | Jest assertion หรือ API behavior |
กฎสำคัญ
อย่าเรียก Supertest ว่า framework
Supertest เป็น HTTP client library ที่ช่วยสร้าง request ไม่ได้กำหนด test suite หรือ assertion ทั้งหมด
อย่าใช้ Nest Testing แทน HTTP test
การดึง service ด้วย `moduleRef.get()` เหมาะกับ boundary อื่น แต่ไม่พิสูจน์ว่า request ผ่าน HTTP route จริง
ประโยคช่วยจำ
Jest ถามว่า test ใดกำลังรัน, Supertest ถามว่า client ส่งอะไร, NestJS ตอบว่า application รับ request อย่างไร