Supertest · เริ่มต้นกับ Supertest
Supertest คืออะไร
รู้จัก Supertest ในฐานะ HTTP client สำหรับทดสอบ API โดยไม่ใช่ test runner
Supertest คือ HTTP testing client
Supertest คือ library ที่ทำหน้าที่เป็น HTTP testing client หรือ client จำลองสำหรับส่ง request ไปยัง HTTP server แล้วอ่าน response ที่ server ส่งกลับมา เราใช้มันตรวจว่า API ตอบสนองตรงตามพฤติกรรมที่ client พึ่งพาหรือไม่ เช่น ส่ง `GET /todos` แล้วได้ status `200` พร้อม collection ที่มีรูปแบบถูกต้อง
ใน track นี้ Supertest จะรับ server object จาก NestJS application ที่เตรียมไว้ใน test แล้วสร้าง request ให้เรา จึงไม่ต้องเปิด browser หรือเขียน client จริงขึ้นมาใหม่ทุกครั้ง จุดสำคัญคือเรากำลังจำลองมุมมองของ caller ไม่ได้เรียก method ภายในของ service โดยตรง
อ่านตัวอย่างจากซ้ายไปขวา: `request(...)` เลือก server target, `.get(...)` เลือก HTTP method และ path, `await` รอให้ request เสร็จ, ส่วน `response` คือข้อมูลที่ใช้ตรวจผลลัพธ์ หลังจากได้ response แล้วเราจึงตรวจ status, headers หรือ body ตาม contract ของ API
อ่าน request และ response ให้เป็นคนละฝั่ง
| ส่วน | คำถามที่เรากำลังส่ง | ตัวอย่าง |
|---|---|---|
| Request | client ต้องการทำอะไรกับ resource | GET /todos |
| Status | server ตัดสินผลของ request อย่างไร | 200 OK |
| Headers | มี metadata อะไรที่ client ต้องรู้ | content-type: application/json |
| Body | ข้อมูลหลักที่ server ส่งกลับคืออะไร | { items: [...], total: 1 } |
การแยก request กับ response ช่วยให้เขียน test เป็นคำถามที่ชัดเจนขึ้น เช่น “เมื่อส่ง request นี้ ระบบตอบ status อะไร และคืน body แบบใด” แทนการเริ่มจากการเดาว่าต้องเรียก method ของ class ใด
กฎสำคัญ
เริ่มจากสิ่งที่ caller เห็น
status, headers, body และ error response เป็นหลักฐานหลักของ HTTP test
`await` สำคัญกับ response
ต้องรอ request ให้เสร็จก่อนอ่าน `response` ไม่เช่นนั้น test อาจจบก่อนมีผลลัพธ์
ไม่ต้องจัดการ port ในตัวอย่างพื้นฐาน
เมื่อใช้ server object จาก NestJS application, Supertest สามารถส่ง request เข้า target นั้นได้โดยไม่ต้องกำหนด port เอง
Supertest ใช้เมื่อไร และไม่ใช่อะไร
เหมาะกับการตรวจ API ที่ต้องพิสูจน์เส้นทางตั้งแต่ HTTP request จนถึง HTTP response เช่น route mapping, validation, authentication หรือผลลัพธ์ของการสร้าง resource รายละเอียดว่าขอบเขตนั้นผ่านชั้นใดบ้างจะอธิบายในบท E2E Test Boundary
| สิ่งที่กำลังทำ | เครื่องมือหรือ boundary ที่เหมาะ | เหตุผล |
|---|---|---|
| ส่ง `POST /todos` แล้วตรวจ status/body | Supertest + E2E test | พิสูจน์ behavior ที่ caller เห็นผ่าน HTTP |
| เรียก `service.createTodo(dto)` โดยตรง | unit หรือ integration test ของ service | โฟกัส business logic โดยไม่ผ่าน HTTP layer |
| ตรวจว่าปุ่มใน browser เปลี่ยนหน้า | browser/component test | คำถามอยู่ที่ UI และ browser behavior ไม่ใช่ HTTP client อย่างเดียว |
จำให้แม่น
Supertest ไม่ใช่ test runner และไม่ใช่ framework ที่กำหนดโครงสร้าง test ทั้งหมด หน้าที่หลักของมันคือสร้าง HTTP request และช่วยให้เราอ่านหรือ assert response ได้ ส่วน Jest จะเป็นหนึ่งในเครื่องมือที่ใช้ค้นหา รัน และตรวจ test