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

NestJS(Fastify)端到端测试:使用Jest模拟Prisma客户端

在NestJS中用jest-mock-extended模拟Prisma进行E2E测试

1. 安装依赖

  • 安装测试所需依赖:
    npm install --save-dev jest-mock-extended
    

2. 配置Jest

在你的jest-e2e.json或jest.config.js中添加模块映射,让测试环境加载mock文件而非真实的Prisma客户端:

module.exports = {
  // 保留原有配置
  moduleNameMapper: {
    '^@prisma/client$': '<rootDir>/src/test/mocks/prisma.mock.ts',
  },
};

3. 编写Prisma Mock文件

在src/test/mocks/prisma.mock.ts中创建深度mock的Prisma客户端:

import { mockDeep, DeepMockProxy } from 'jest-mock-extended';
import { PrismaClient } from '@prisma/client';

export const prismaMock = mockDeep<PrismaClient>();
export type MockPrisma = DeepMockProxy<PrismaClient>;

4. 在E2E测试中替换Prisma服务

在测试文件中,通过NestJS的测试模块覆盖真实的Prisma服务,注入mock实例:

import { Test } from '@nestjs/testing';
import { INestApplication } from '@nestjs/common';
import * as request from 'supertest';
import { AppModule } from '../src/app.module';
import { PrismaService } from '../src/prisma/prisma.service';
import { prismaMock } from './mocks/prisma.mock';

describe('用户模块E2E测试', () => {
  let app: INestApplication;

  beforeEach(async () => {
    const moduleFixture = await Test.createTestingModule({
      imports: [AppModule],
    })
      .overrideProvider(PrismaService)
      .useValue(prismaMock)
      .compile();

    app = moduleFixture.createNestApplication();
    await app.init();
  });

  afterEach(async () => {
    await app.close();
    jest.clearAllMocks(); // 重置mock调用记录,避免测试污染
  });

  it('应该正确模拟Prisma的用户查询', async () => {
    // 预设mock返回值
    prismaMock.user.findUnique.mockResolvedValue({
      id: 1,
      email: 'test@example.com',
      name: '测试用户',
    });

    // 发送请求并断言结果
    const response = await request(app.getHttpServer())
      .get('/users/1')
      .expect(200);

    expect(response.body).toEqual({
      id: 1,
      email: 'test@example.com',
      name: '测试用户',
    });
    // 验证Prisma方法是否被正确调用
    expect(prismaMock.user.findUnique).toHaveBeenCalledWith({
      where: { id: 1 },
    });
  });
});

关键注意点

  • 如果你的项目中封装了自定义的PrismaService(而非直接使用PrismaClient),需要确保mock实例能覆盖该服务内部的Prisma客户端引用
  • 每次测试后务必重置mock,防止测试用例之间的状态污染

内容的提问来源于stack exchange,提问作者Valentin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:25:08