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

如何测试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的测试场景,能自动处理环境兼容问题:

  1. 安装依赖:
npm install --save-dev @next/testing jest-environment-jsdom
  1. 配置Jest(修改jest.config.js):
module.exports = {
  testEnvironment: 'jest-environment-jsdom',
  setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
}
  1. 编写测试用例:
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支持:

  1. 安装whatwg-fetch(提供标准Fetch API实现):
npm install --save-dev whatwg-fetch
  1. 在Jest初始化文件(如jest.setup.js)中引入:
import 'whatwg-fetch'
  1. 编写测试用例:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:37:11