如何测试Next.js 13的API Route处理器?
解决Next.js路由处理器Jest测试中Request未定义的问题
原因分析
Next.js的next/server模块依赖浏览器/Edge Runtime提供的Web API(比如Request),而Jest默认运行在Node.js环境,原生不支持这些API,直接测试就会触发ReferenceError。
解决方案
方案1:用Next.js官方测试工具(推荐)
Next.js官方提供的@next/testing包专门适配App Router的测试场景,能自动处理环境兼容问题:
- 安装依赖:
npm install --save-dev @next/testing jest-environment-jsdom
- 配置Jest(修改
jest.config.js):
module.exports = { testEnvironment: 'jest-environment-jsdom', setupFilesAfterEnv: ['<rootDir>/jest.setup.js'], }
- 编写测试用例:
import { GET } from '@/app/api/route' describe('API路由测试', () => { it('返回成功响应', async () => { const response = await GET() const data = await response.json() expect(data.success).toBe(true) }) })
方案2:手动模拟Web API环境
如果不想用官方工具,可手动在Jest中注入Web API支持:
- 安装
whatwg-fetch(提供标准Fetch API实现):
npm install --save-dev whatwg-fetch
- 在Jest初始化文件(如
jest.setup.js)中引入:
import 'whatwg-fetch'
- 编写测试用例:
import { GET } from '@/app/api/route' describe('API路由测试', () => { it('返回成功响应', async () => { // 若处理器需要Request参数,可手动创建模拟对象 const mockRequest = new Request('http://localhost/api') const response = await GET(mockRequest) const data = await response.json() expect(data.success).toBe(true) }) })
方案3:适配Edge Runtime测试
如果你的路由针对Edge Runtime开发,可配置Jest使用Edge环境:
修改jest.config.js:
module.exports = { testEnvironment: 'node', testEnvironmentOptions: { customExportConditions: ['next', 'edge'] } }
之后正常编写测试用例即可。
内容的提问来源于stack exchange,提问作者idlackage
相关产品推荐
相关产品推荐

