You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:25:11