概要
Next.js
のAPIルートは、サーバーサイドで処理を行うエンドポイントを構築できる強力な機能です。APIルートのテストは、サーバーとクライアントの間で正しいデータの送受信を確認するために重要です。本記事では、APIルートのテスト方法、特にJest
とSupertest
を活用した効率的なテスト戦略を紹介します。
APIルートの基本的なテスト
Next.js
のAPIルートは、pages/api
ディレクトリに配置されたファイルがエンドポイントとして機能します。これらのエンドポイントに対してテストを行うには、Jest
とSupertest
を使用するのが一般的です。これにより、HTTPリクエストをシミュレートし、APIが正しく機能しているかを確認できます。
テスト環境のセットアップ
まず、必要なパッケージをインストールします。
npm install --save-dev jest supertest
jest.config.js
ファイルを作成し、以下の設定を追加します。
module.exports = {
testEnvironment: 'node',
};
これで、Node.jsの環境下でAPIルートのテストを実行できるようになります。
基本的なGETリクエストのテスト
次に、APIエンドポイントに対するテストを実装します。例えば、/api/hello
に対するGETリクエストのテストは以下のように書けます。
import request from 'supertest';
import handler from '../pages/api/hello';
describe('API Route /api/hello', () => {
it('responds with a message', async () => {
const res = await request(handler).get('/api/hello');
expect(res.status).toBe(200);
expect(res.body.message).toBe('Hello from `Next.js`!');
});
});
ここでは、Supertest
を使ってGETリクエストを送り、ステータスコードとレスポンスのメッセージを確認しています。
POSTリクエストのテスト
POSTリクエストも同様にテストできます。以下は、POSTリクエストでデータを送信し、サーバーがそのデータを処理する例です。
import request from 'supertest';
import handler from '../pages/api/data';
describe('API Route /api/data', () => {
it('handles POST requests', async () => {
const res = await request(handler)
.post('/api/data')
.send({ name: 'John', email: 'john@example.com' });
expect(res.status).toBe(200);
expect(res.body.message).toBe('Data received');
expect(res.body.data).toEqual({ name: 'John', email: 'john@example.com' });
});
});
ここでは、send()
メソッドでPOSTリクエストのボディを送信し、その内容が正しく処理されることを確認しています。
Dynamic API Routesのテスト
動的なAPIルート(Dynamic API Routes)は、エンドポイントにパラメータを含むURLを使用します。これをテストするには、リクエストに動的パラメータを組み込みます。
import request from 'supertest';
import handler from '../pages/api/users/[id]';
describe('Dynamic API Route /api/users/[id]', () => {
it('returns user data for a given ID', async () => {
const res = await request(handler).get('/api/users/123');
expect(res.status).toBe(200);
expect(res.body.userId).toBe('123');
});
});
この例では、動的なIDを含むAPIルート/api/users/[id]
に対してGETリクエストを送り、そのIDに応じたデータが正しく返されるかを確認しています。
APIルートのテストを簡略化するライブラリ
手動でサーバーを設定するのが面倒な場合は、next-test-api-route-handler
を使うとテストがシンプルになります。このライブラリを使用することで、手動でサーバーを立ち上げることなくAPIテストが可能です。
import { testApiHandler } from 'next-test-api-route-handler';
import handler from '../pages/api/test';
describe('Test API with next-test-api-route-handler', () => {
it('tests the API handler', async () => {
await testApiHandler({
handler,
test: async ({ fetch }) => {
const res = await fetch({ method: 'GET' });
expect(res.status).toBe(200);
},
});
});
});
これにより、APIルートのテストがさらにシンプルになります。
結論
Next.js
のAPIルートは、サーバーサイド処理を簡単に統合できる便利な機能です。そのAPIルートが正しく動作するかを確認するために、JestとSupertestを使って効率的にテストを行いましょう。Dynamic API RoutesやPOSTリクエストのテストもカバーし、さらにnext-test-api-route-handler
を使用することで、テストの手間を軽減できます。