We test POST requests with a body to make sure our server correctly receives and processes data sent by users or other apps.
Testing POST with request body in Express
request.post('/path').send({ key: 'value' }).expect(statusCode)
Use .send() to include the request body as an object.
Use testing libraries like supertest with Express to simulate requests.
request.post('/users').send({ name: 'Alice' }).expect(201)
request.post('/login').send({ username: 'bob', password: '1234' }).expect(200)
This Express app has a POST route '/greet' that expects a JSON body with a 'name'. The test sends { name: 'Sam' } and expects a 200 response with a greeting message. The test prints the message from the response.
import express from 'express'; import request from 'supertest'; const app = express(); app.use(express.json()); app.post('/greet', (req, res) => { const { name } = req.body; if (!name) { return res.status(400).send({ error: 'Name is required' }); } res.status(200).send({ message: `Hello, ${name}!` }); }); // Test (async () => { const response = await request(app) .post('/greet') .send({ name: 'Sam' }) .expect(200); console.log(response.body.message); })();
Always use express.json() middleware to parse JSON bodies in Express.
Use supertest to simulate HTTP requests easily in tests.
Check both status codes and response bodies to ensure your API works as expected.
Testing POST with a request body ensures your server handles incoming data correctly.
Use .send() to include data in your test requests.
Check both the response status and content to confirm correct behavior.
Practice
Solution
Step 1: Understand POST request role
POST requests send data to the server, so testing ensures data is received and handled.Step 2: Identify testing goal
Testing POST with a body checks if the server processes the data correctly, not just the response time or ignoring data.Final Answer:
To verify the server correctly receives and processes the sent data -> Option AQuick Check:
POST body testing = verify data handling [OK]
- Confusing POST with GET request testing
- Ignoring the request body in tests
- Testing only response time without data validation
Solution
Step 1: Identify correct HTTP method and data sending
POST requests use .post() and .send() to include JSON body data in Supertest.Step 2: Evaluate options
The option with request(app).post('/api').send({ name: 'John' }) uses .post() and .send() correctly. Using .get() is wrong for sending body data. Using .query() sends URL params, not body data. Using .body() is not a Supertest method.Final Answer:
request(app).post('/api').send({ name: 'John' }) -> Option BQuick Check:
POST + .send() = correct syntax [OK]
- Using GET instead of POST for sending body data
- Using .query() instead of .send() for body
- Trying to use .body() method which doesn't exist
app.use(express.json());
app.post('/user', (req, res) => {
res.json({ received: req.body.name });
});
request(app)
.post('/user')
.send({ name: 'Alice' })
.then(res => console.log(res.body));Solution
Step 1: Understand route response
The route sends back JSON with key 'received' set to req.body.name.Step 2: Analyze test request body
The test sends { name: 'Alice' }, so req.body.name is 'Alice'.Final Answer:
{ "received": "Alice" } -> Option AQuick Check:
Response body = { received: 'Alice' } [OK]
- Expecting original body instead of transformed response
- Forgetting to parse JSON body in Express (missing middleware)
- Assuming empty response or error without middleware
app.post('/data', (req, res) => {
res.json(req.body);
});
request(app)
.post('/data')
.send({ key: 'value' })
.expect(200, { key: 'value' });Solution
Step 1: Identify why req.body is empty
Express needs middleware like express.json() to parse JSON body; without it, req.body is empty.Step 2: Check test and route setup
The test sends JSON with .send(), which is correct; route uses POST correctly; status 200 is expected.Final Answer:
Missing middleware to parse JSON body like express.json() -> Option DQuick Check:
Missing express.json() = empty req.body [OK]
- Not adding express.json() middleware
- Confusing .send() with .query() for body data
- Expecting req.body without parsing middleware
app.use(express.json());
app.post('/items', (req, res) => {
res.json({ count: req.body.length });
});Solution
Step 1: Understand route expects JSON array body
The route reads req.body.length, so the body must be an array.Step 2: Check test sending array correctly
request(app).post('/items').send([1, 2, 3]).expect(200).then(res => { if(res.body.count !== 3) throw new Error('Wrong count'); }); sends an actual array with .send(), which is correct. request(app).post('/items').send('{1,2,3}').expect(200).then(res => { if(res.body.count !== 3) throw new Error('Wrong count'); }); sends a string, not JSON array. request(app).post('/items').send({ length: 3 }).expect(200).then(res => { if(res.body.count !== 3) throw new Error('Wrong count'); }); sends an object, not array. request(app).post('/items').query([1, 2, 3]).expect(200).then(res => { if(res.body.count !== 3) throw new Error('Wrong count'); }); uses .query() which sends URL params, not body.Final Answer:
request(app).post('/items').send([1, 2, 3]).expect(200).then(res => { if(res.body.count !== 3) throw new Error('Wrong count'); }); -> Option CQuick Check:
Send array with .send() to test array length [OK]
- Sending array as string instead of JSON
- Using .query() instead of .send() for body data
- Sending object with length property instead of array
Ready to prove it?
Pass the test and this pattern moves unknown
