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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:24:07