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

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内置的方法解析响应内容。

修复步骤

  1. 调整响应断言逻辑:不要直接断言response.body,而是调用response.json()(NextResponse提供的方法)解析响应数据后再断言。
  2. 统一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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 22:48:09