NodeJS 如何在不运行实时服务器的情况下测试Express应用程序?

pkwftd7m  于 2023-06-05  发布在  Node.js
关注(0)|答案(1)|浏览(309)

在许多Web框架中,可以在应用程序上执行集成测试,而无需启动实时服务器(参见Flask,Fastify和Laravel的文档)。模拟网络而不是通过localhost实际发送请求可以显著提高性能。例如,在benchmark I made中,使用Flask的测试客户端比使用requests库(14秒)发送真实的请求快近5倍(3秒)。
但是,在使用Express时,我一直没能找到实现这一点的方法。像supertest这样的工具似乎在一个临时端口上悄悄地启动服务器,而不是模拟网络。
如何对Express服务器执行模拟请求,而不是启动服务器并通过localhost向其请求?

nwwlzxa7

nwwlzxa71#

您可以使用light-my-request库,它与Express以及许多其他基于Node的Web框架兼容。

// server.js
import express, { json } from 'express';

const server = express();

server.use(json());

server.post('/my/route', (req, res) => {
  const { name } = req.body;
  res.json({ greeting: `Hello, ${name}` });
});

export default server;
// server.test.js
import server from './server.js';
import inject from 'light-my-requests';

test('Basic request', async () => {
  const response = await inject(server, {
    method: 'POST',
    url: '/my/route',
    headers: { 'Content-Type': 'application/json' },
    payload: JSON.stringify({ name: 'Miguel' }),
  };
  const json = JSON.parse(response.payload);
  expect(json).toStrictEqual({ greeting: 'Hello, Miguel' });
});

性能比使用fetch API(6.5秒)快50%(4.3秒),至少在我运行的基准测试中是这样。

相关问题