Open2

supertest で Express のテストを書くのが楽すぎる

tbabatbaba

Express のテストをうまいことやりたい

という欲求がある。
というか Express だけでなく、なんらかのリクエストを送信して、レスポンスを受け取る、とかそういうやつのテストを書くときは大体苦労する。
なので、とりあえず簡単に解決する方法として、 supertest を利用して実際にリクエストを投げる、というやり方を書いておく。

tbabatbaba

作業ログ

まずは supertest のインストール。

$ npm install -D supertest

Express のベースになっているファイルから、パスを定義している部分を外に切り出す。というか、要するにパス定義とリッスン定義を切り離す。
そうしないと、ファイルを読み込んだときに実際にリッスンしてしまい、テストが終了しなくなってしまうのだ。

app.ts
import express from "express";

const app = express();

app.get("/", (_, res) => {
  res.json({ status: "ok" });
});

export default app;
index.ts
import app from "./app";

const port = process.env.PORT;
app.listen(port, () => console.log(`Running the app on port: ${port}`));

その後、テストを書く。

import request from "supertest";
import app from "@/src/app";

describe("GET /", () => {
  it("returns 200", async () => {
    const result = request(app).get("/");
    expect(result.statusCode).toBe(200);
  });
});