0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

supertestを利用してnodeのintegrationテストを実装する

Last updated at Posted at 2024-11-29

はじめに

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つのエンドポイントのみだとあまりピンとこないかもしれませんが、エンドポイントが増えていったときにこうしたサーバーを立ち上げずにテストができることは、とても便利に感じると思います。

今後もこうしたテストなどの書き方について発信できたらと思っています。
よかったら使ってみてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?