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
相关产品推荐
相关产品推荐

