为何我的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
相关产品推荐
相关产品推荐

