Jestが提供するモック関数を利用することで、
Expressのハンドラ関数の単体テストを作成します。
方針
以下のようなディレクトリ構成に変更します。
変更前 | 変更後 |
app.ts | app.ts |
なし | server.ts |
なし | ping/controller/pingController.ts |
なし | ping/service/pingService.ts |
手順
app.tsを以下のように編集する。
import express from 'express';
import * as pingController from './ping/controller/pingController';
export const app = express();
app.get('/ping', pingController.ping);
server.tsを作成し、以下のように編集する。
import { app } from './app';
const port = 3000;
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
ping/controller/pingController.tsを作成し、以下のように編集する。
import express from 'express';
import * as pingService from '../service/pingService';
export const ping = (req: express.Request, res: express.Response) => {
res.send(pingService.ping());
};
ping/service/pingService.tsを作成し、以下のように編集する。
export const ping = (): string => {
return 'pong';
};
ping/test/controller/pingController.test.tsを作成し、以下のように編集する。
import express from 'express';
import * as pingController from '../../controller/pingController';
describe('/ping', () => {
test('pongという文字列を返す', () => {
const mockReq: Partial<express.Request> = {};
const mockRes: Partial<express.Response> = {
send: jest.fn()
};
pingController.ping(
mockReq as express.Request,
mockRes as express.Response
);
expect(mockRes.send).toBeCalledWith('pong');
});
});
参考
- Unit test Express middleware – TypeScript, Jest | JavaScript in Plain English
https://javascript.plainenglish.io/how-to-unit-test-express-middleware-typescript-jest-c6a7ad166e74 - モック関数 · Jest
https://jestjs.io/ja/docs/mock-functions - Expect · Jest
https://jestjs.io/ja/docs/expect#tohavebeencalledwitharg1-arg2-