如何用Jest和Supertest测试Fastify应用?解决超时问题
解决Jest+Supertest测试Fastify超时问题
你的测试超时是因为Fastify实例还未完成路由注册等初始化操作就被Supertest请求了。Fastify需要调用ready()方法确认所有插件、路由注册完成,或者调用listen()启动服务后才能正常处理请求。
以下是正确的测试示例:
修正后的测试文件
// @ts-nocheck import { FastifyInstance } from 'fastify' import request from 'supertest' import app from '../app' let server: FastifyInstance beforeAll(async () => { // 等待Fastify完成所有插件和路由的初始化 await app.ready() server = app }) afterAll(async () => { // 正确关闭Fastify实例,释放资源 await server.close() }) test('Should get a 200 OK', async () => { const response = await request(server.server).get('/') expect(response.status).toBe(200) })
另一种方案:启动临时服务
如果需要模拟真实启动场景,可以让Fastify监听一个随机端口(0会自动分配可用端口):
// @ts-nocheck import request from 'supertest' import app from '../app' beforeAll(async () => { // 监听0端口,自动获取可用端口 await app.listen({ port: 0 }) }) afterAll(async () => { await app.close() }) test('Should get a 200 OK', async () => { // 直接使用app.server传给supertest const response = await request(app.server).get('/') expect(response.status).toBe(200) })
关键注意点
- 必须等待
app.ready()或app.listen()完成后再发起测试请求,确保Fastify初始化完毕 - 用
await server.close()替代直接调用server.close(),因为Fastify的关闭是异步操作,需要等待完成避免资源泄漏 - Supertest需要传入的是Fastify的
server属性(即app.server),而不是Fastify实例本身
内容的提问来源于stack exchange,提问作者Samuel A. Souza
相关产品推荐
相关产品推荐

