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

为何我的Prisma单元测试会调用真实数据库?

问题

我按照《Unit testing with Prisma》指南编写了向数据库创建数据的函数的单元测试,预期Mock Prisma Client可以避免调用真实数据库,但运行测试时,数据库仍被实际调用并创建了数据。相关代码文件如下:

prisma.js(Prisma Client 实例化文件)

import { PrismaClient } from "@prisma/client"

let prisma

if(process.env.NODE_ENV === 'production') {
    prisma = new PrismaClient()
} else {
    if(!global.prisma) {
        global.prisma = new PrismaClient()
    }
    prisma = global.prisma
}

export default prisma

singleton.ts(Jest Mock 配置文件)

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

import prisma from './client'

jest.mock('./client', () => ({
  __esModule: true,
  default: mockDeep<PrismaClient>(),
}))

beforeEach(() => {
  mockReset(prismaMock)
})

export const prismaMock = prisma as unknown as DeepMockProxy<PrismaClient>

schema.prisma(数据库模型)

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model Test {
  id            Int         @id @default(autoincrement())
}

functions-without-context.ts(数据创建函数)

import prisma from './client'

interface CreateTest {
    description: string
}

export async function createTest(test: CreateTest) {
    return await prisma.test.create({
        data: test,
    })
}

with-singleton.ts(测试用例)

import { createTest, updateTest } from '../lib/mock/functions-without-context'
import { prismaMock } from '../lib/mock/singleton'

it('should create new data ', async () => {
  const test = {
    id: 1,
  }

  prismaMock.test.prismaMock.mockResolvedValue(test)

  await expect(createTest(test)).resolves.toEqual({
    id: 1,
  })
})

我的代码和指南示例基本一致,但测试仍会调用真实数据库,请问如何阻止?


解决方案

1. 修复测试用例中的Mock语法错误

测试代码里Mock方法的路径写错了,应该直接Mock prisma.test.create 方法,而非prismaMock.test.prismaMock。同时补充CreateTest接口要求的description字段,修改后测试用例如下:

it('should create new data ', async () => {
  const test = {
    id: 1,
    description: "test content"
  }

  // 正确Mock create方法的返回值
  prismaMock.test.create.mockResolvedValue(test)

  await expect(createTest(test)).resolves.toEqual(test)
})

2. 确认Jest Mock的路径匹配

确保singleton.ts中jest.mock('./client')的路径,和functions-without-context.ts中import prisma from './client'的路径完全一致。路径不匹配会导致Jest无法正确替换真实的Prisma Client实例。

3. 禁用Jest模块缓存

Jest的模块缓存可能导致Mock未生效,运行测试时添加--no-cache参数:

jest --no-cache

4. 确保测试环境的NODE_ENV设置

如果测试时NODE_ENV不是test,prisma.js会创建真实的Prisma Client实例。可以在package.json的测试脚本中设置环境变量:

{
  "scripts": {
    "test": "NODE_ENV=test jest"
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:53:28