NextJs路由Jest测试报错:TypeError: Response.json is not a function
问题:Next.js API路由Jest测试报错
TypeError: Response.json is not a function 使用Next.js路由、Prisma与PostgreSQL开发用户API路由,本地手动测试时功能正常,但执行Jest自动化测试时触发报错:TypeError: Response.json is not a function,报错指向路由文件中的return NextResponse.json({data: users}, {status: 200});代码行。尝试将返回值转换为any类型后问题仍未解决。
相关代码
/src/app/api/users/route.ts
import { NextResponse, NextRequest } from "next/server"; import { prisma } from "@/lib/prisma"; // routes /api/users export async function GET(request: NextRequest) { const users = await prisma.user.findMany({ orderBy: { last_name: 'asc', } }) return NextResponse.json({data: users}, {status: 200}); }
/test/app/api/users/route.test.tsx
import { GET } from '@/app/api/users/route'; import { NextRequest } from 'next/server'; import { prisma } from '../../../../src/lib/prisma'; // Mock the Prisma module jest.mock('../../../../src/lib/prisma', () => ({ prisma: { user: { findMany: jest.fn(), }, }, })); describe('GET /api/users', () => { it('should return an array of users sorted by last name', async () => { const mockedRequest = {} as NextRequest; const mockedUsers = [ { id: 1, last_name: 'User A' }, { id: 2, last_name: 'User B' }, ]; // Mock the behavior of prisma.user.findMany (prisma.user.findMany as jest.Mock).mockResolvedValue(mockedUsers); // Call the GET function with the mocked request const response = await GET(mockedRequest); // Assert that prisma.user.findMany has been called with the correct parameters expect(prisma.user.findMany).toHaveBeenCalledWith({ orderBy: { last_name: 'asc', }, }); // Assert the response expect(response.status).toBe(200); expect(response.body).toEqual({ data: mockedUsers }); }); });
解决方法
问题根源
Jest环境中,Next.js返回的NextResponse并非浏览器/Node.js原生的Response对象,直接访问response.body或调用原生Response.json()方法会触发错误。需要使用NextResponse内置的方法解析响应内容。
修复步骤
- 调整响应断言逻辑:不要直接断言
response.body,而是调用response.json()(NextResponse提供的方法)解析响应数据后再断言。 - 统一Prisma的mock路径:确保Jest的mock路径与代码中的导入路径一致,避免mock失效。
修改后的测试代码
import { GET } from '@/app/api/users/route'; import { NextRequest } from 'next/server'; import { prisma } from '@/lib/prisma'; // 统一mock路径,与代码导入路径匹配 jest.mock('@/lib/prisma', () => ({ prisma: { user: { findMany: jest.fn(), }, }, })); describe('GET /api/users', () => { it('should return an array of users sorted by last name', async () => { const mockedRequest = {} as NextRequest; const mockedUsers = [ { id: 1, last_name: 'User A' }, { id: 2, last_name: 'User B' }, ]; (prisma.user.findMany as jest.Mock).mockResolvedValue(mockedUsers); const response = await GET(mockedRequest); expect(prisma.user.findMany).toHaveBeenCalledWith({ orderBy: { last_name: 'asc', }, }); expect(response.status).toBe(200); // 调用NextResponse的json方法解析数据后断言 const responseData = await response.json(); expect(responseData).toEqual({ data: mockedUsers }); }); });
额外提示
- 不要随意将
NextResponse转为any类型,这会掩盖类型问题且无法解决根本矛盾。 - 若仍有问题,检查Jest配置是否符合Next.js官方要求,确保模块解析逻辑正确。
内容的提问来源于stack exchange,提问作者EASoftware
相关产品推荐
相关产品推荐

