はじめに
nodeでintegrationテストの実装をする際にテスト用サーバーを立ち上げたり、準備がいろいろと大変だったりします。
そんな面倒に感じるintegrationテストをなるべく低コスト?で実装できる物があると嬉しいですよね
なぜsupertestが良いのか
- supertestを利用すると比較的容易にAPIにrequestを投げるようなコードがかけるため、テストコードの可読性が向上する
- サーバーを立ち上げることなくシミュレートしてくれるため、テスト用にサーバーを立てるような実装をしなくてもよい
supertestについて
実装方法
supertestを使うとどんなテストを実装する必要があるのかを見ていきます。
アプリケーションサイドのロジックとテストの実装それぞれ見ていきましょう
アプリケーション側の実装
import express, { Request, Response } from "express";
export const app = express();
const PORT = process.env.PORT;
/**
* =========================
* 今回テストの対象となるエンドポイント
* =========================
*/
app.get("/api/v1/sample", (request: Request, response: Response) => {
response.status(200).json({
message: "This endpoint is get",
});
});
app.listen(PORT, () => {
console.log("Server running at PORT: ", PORT);
}).on("error", (error) => {
// gracefully handle error
throw new Error(error.message);
});
テストの実装
import request from 'supertest';
import { app } from '..';
describe('index', () => {
it('/api/v1/sampleからレスポンスが返ること', async () => {
const response = await request(app).get('/api/v1/sample');
// ステータスコードの確認
expect(response.status).toBe(200);
// ステータスコードの確認
expect(response.body).toEqual({ message: 'This endpoint is get' });
});
})
動かしてみるとテストがpassしているかと思います
最後に
今回はsupertestを使ったexpressのテストについて取り上げました
1つのエンドポイントのみだとあまりピンとこないかもしれませんが、エンドポイントが増えていったときにこうしたサーバーを立ち上げずにテストができることは、とても便利に感じると思います。
今後もこうしたテストなどの書き方について発信できたらと思っています。
よかったら使ってみてください!