Supertest helps you check if your web server works correctly by sending fake requests and checking the answers.
Supertest for HTTP assertions in Express
const request = require('supertest'); const app = require('./app'); describe('GET /path', () => { it('responds with status 200', async () => { await request(app) .get('/path') .expect(200) .expect('Content-Type', /json/); }); });
Use request(app) to start testing your Express app.
Chain methods like .get(), .post(), and .expect() to define the test.
await request(app).get('/users').expect(200);
await request(app).post('/login').send({username: 'bob', password: '123'}).expect(401);
await request(app).get('/data').expect('Content-Type', /json/);
This example creates a simple Express app with one route /hello that returns a JSON message. Then it uses Supertest to send a GET request to /hello, checks the status and content type, and prints the response body.
const express = require('express'); const request = require('supertest'); const app = express(); app.use(express.json()); app.get('/hello', (req, res) => { res.status(200).json({message: 'Hello, world!'}); }); // Test (async () => { const response = await request(app) .get('/hello') .expect(200) .expect('Content-Type', /json/); console.log(response.body); })();
Supertest works well with testing frameworks like Jest or Mocha for better test organization.
Always close your server or use app instances to avoid conflicts in tests.
You can chain multiple .expect() calls to check status, headers, and body.
Supertest lets you test your Express server by sending fake HTTP requests.
You can check status codes, response headers, and response bodies easily.
It helps catch bugs early by automating server tests without a browser.
Practice
Supertest in Express applications?Solution
Step 1: Understand Supertest's role
Supertest is a tool used to simulate HTTP requests to your Express server without needing a browser.Step 2: Identify its main use
It helps test server responses like status codes and data returned, ensuring your server works as expected.Final Answer:
To send fake HTTP requests and check server responses -> Option BQuick Check:
Supertest = fake HTTP requests and response checks [OK]
- Thinking Supertest styles pages
- Confusing Supertest with deployment tools
- Assuming it manages databases
Solution
Step 1: Identify import syntax
In Node.js, the most common way to import Supertest is using CommonJS syntax:const request = require('supertest');.Step 2: Check other options
import request from 'supertest'; uses ES module syntax which requires specific setup and may not work by default. const supertest = import('supertest'); uses invalid syntax. require('supertest').request; accesses a non-existent property.Final Answer:
const request = require('supertest'); -> Option CQuick Check:
CommonJS require syntax = const request = require('supertest'); [OK]
- Using ES module import without setup
- Trying to destructure or access wrong properties
- Using invalid import syntax
import request from 'supertest';
import express from 'express';
const app = express();
app.get('/hello', (req, res) => res.status(200).send('Hi'));
test('GET /hello returns status 200', async () => {
const response = await request(app).get('/hello');
expect(response.status).toBe(201);
});Solution
Step 1: Analyze the Express route
The route/hellosends a response with status code 200 and body 'Hi'.Step 2: Check the test assertion
The test expects status 201, but the actual response status is 200, so the test will fail if expecting 201.Final Answer:
200 -> Option AQuick Check:
Route sends 200, test expects 201, actual = 200 [OK]
- Confusing expected and actual status codes
- Assuming 201 is default success code
- Ignoring route's explicit status
import request from 'supertest';
import app from './app';
test('POST /data returns 201', async () => {
const res = await request(app).post('/data')
.send({ name: 'Alice' })
.expect(201);
expect(res.body.name).toBe('Alice');
});Solution
Step 1: Review async/await usage
Theawaitis correctly used beforerequest(app).post(...), so the promise resolves before assertions.Step 2: Check .expect and body assertions
Using.expect(201)is valid and chainingexpect(res.body.name).toBe('Alice')is correct after awaiting the response.Final Answer:
No error, code is correct -> Option AQuick Check:
Await + .expect + body check = correct usage [OK]
- Forgetting await causing unresolved promises
- Misusing .expect without awaiting
- Assuming POST cannot have a body
type=admin is present, otherwise it returns 403 Forbidden. Which Supertest code snippet correctly tests the 403 response when the query parameter is missing?Solution
Step 1: Understand route behavior
The route returns JSON only if querytype=adminis present; otherwise, it returns 403 Forbidden.Step 2: Identify test for missing query parameter
To test 403 when the parameter is missing, send a GET request without any query parameters.Step 3: Evaluate options
await request(app).get('/secret').expect(403); sends GET without query, expecting 403, which matches the requirement. await request(app).get('/secret').query({ type: 'user' }).expect(403); sendstype=user, which is not missing but wrong type, so may or may not return 403 depending on implementation. await request(app).post('/secret').send({ type: 'admin' }).expect(403); uses POST instead of GET. await request(app).get('/secret?type=admin').expect(403); sendstype=adminwhich should return success, not 403.Final Answer:
await request(app).get('/secret').expect(403); -> Option DQuick Check:
Missing query param = GET without query = expect 403 [OK]
- Sending wrong HTTP method (POST instead of GET)
- Including wrong query parameters instead of missing
- Expecting 403 when query param is present
Ready to prove it?
Pass the test and this pattern moves unknown
