如何在NodeJS中Mock Prisma 实现数据库连接的模拟测试
Prisma 数据库连接 Mock 方案(适配 GitHub Actions 测试场景)
以下两种方案可覆盖不同测试需求,均兼容PostgreSQL场景下的GitHub Actions流程:
方案1:单元测试场景 - 纯Mock Prisma Client
完全不需要真实数据库连接,所有数据库操作的返回值均可自定义:
- 先安装Mock依赖,以Jest为例:
npm install -D jest-mock-extended @types/jest,用Vitest的话替换为vitest-mock-extended即可 - 测试文件初始化全局Mock实例:
import { PrismaClient } from '@prisma/client' import { mockDeep, DeepMockProxy } from 'jest-mock-extended' // 声明Mock实例类型 type MockPrisma = DeepMockProxy<PrismaClient> let prisma: MockPrisma // 每次测试前重置Mock,避免用例之间污染 beforeEach(() => { prisma = mockDeep<PrismaClient>() })
- 业务代码里优先用依赖注入的方式传入Prisma实例,或者通过模块替换机制把业务代码引用的Prisma实例替换为上述Mock实例,就可以自定义任意增删改查方法的返回值。
方案2:集成测试场景 - 适配GitHub Actions的轻量测试方案
如果需要验证真实SQL执行逻辑,不需要硬Mock连接,GitHub Actions可直接启动临时数据库,性能完全满足CI要求:
- 在GitHub Actions的配置文件中添加PostgreSQL临时服务:
services: postgres: image: postgres:15-alpine env: POSTGRES_USER: test POSTGRES_PASSWORD: test POSTGRES_DB: test ports: - 5432:5432 options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
- 测试执行前先运行
npx prisma migrate deploy初始化测试库表结构,测试完成后容器会自动销毁,不需要额外维护资源。 - 如果需要拦截部分数据库操作,可以结合Prisma的
prisma.$use中间件实现局部Mock,不需要完全替换Client实例。
常见踩坑点
- 不要直接修改全局Prisma实例的原型做Mock,极易导致测试用例之间的Mock数据污染,每次测试前必须重置Mock实例
- 业务代码尽量用依赖注入的方式传入Prisma实例,不要硬编码单例Prisma实例在业务逻辑中,会大幅提升Mock替换成本
- Prisma 5.x版本的Client底层实现有调整,Mock时需要用对应版本的Mock扩展包,避免出现类型不匹配的问题
内容的提问来源于stack exchange,提问作者Tweeno
相关产品推荐
相关产品推荐

