🍵
jest + supertest, HTTP テストの例
概要:
jest + supertest, HTTP テストの例になります
- express を使います
構成
- jest
- supertest
- express
参考
npm add
mkdir sample
cd sample
#
npm init -y
#
npm install --save-dev jest supertest
#
npm i express
- app.js: 適当にレスポンスを返すコード書きます
app.js
const express = require('express')
const app = express()
// GET
app.get("/", async (req, res) => {
res.send({ status: "running" });
});
// POST
app.use(express.json());
app.post("/users", async (req, res) => {
const { password, username } = req.body;
if (!password || !username) {
res.sendStatus(400);
return;
}
res.send({ userId: 0 });
});
module.exports = app;
- server.js
server.js
const app = require('./app')
app.listen(8081, () => {
console.log('listening on port 8081!')
});
Test Code
- app.test.js : エンドポント指定、request を渡す。
app.test.js
const request = require('supertest')
const app = require('./app.js')
describe("GET /", () => {
test("check: running string", async () => {
const response = await request(app).get("/");
expect(response.body.status).toBe("running");
});
});
//
describe("POST /users", () => {
test("check: username, password, userId", async () => {
const response = await request(app).post("/users").send({
username: "user",
password: "pass",
});
expect(response.body.userId).toBeDefined();
});
test("check: username, password rerurn HTTP 400", async () => {
const bodies = [{ username: "user" }, { password: "pass" }, {}];
for (const body of bodies) {
const response = await request(app).post("/users").send(body);
expect(response.statusCode).toBe(400);
}
});
});
- package.json
....
"scripts": {
"test": "jest",
},
....
Test
yarn test
- 結果
$ yarn test
yarn run v1.22.4
$ jest
PASS ./app.test.js
Test Suites: 2 passed, 2 total
Tests: 6 passed, 6 total
Snapshots: 0 total
Time: 0.927 s, estimated 1 s
Ran all test suites.
Done in 1.63s.
- ファイル単体で実行
- 実行するファイルパスを指定すると、実行できました。
# npm
npm run test ./src/test/unit/app.test.ts
#yarn
yarn test ./src/test/unit/app.test.ts
....
Discussion