我为一个在数据库中创建数据的函数编写了一个单元测试。我根据Unit testing with Prisma指南创建了这个测试,根据该指南,模拟Prisma客户端应该可以阻止对我的数据库的调用。然而,当我运行测试时,我的数据库被调用,数据实际上被创建。
要执行测试,有几个相关文件。
在prsma.js
中,我示例化了Prisma客户机。
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模拟默认导出。
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
中,我模拟了在Test
表中创建数据的过程。
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条答案
按热度按时间fykwrbwg1#
也遇到了这个问题。我使用了整个应用程序中使用的相同的prisma客户端,它可以正确地模拟。
字符串
如果您已经在
./lib/prisma.ts
中有一个导出的prisma客户端,用于调用数据库,请在.singleton.ts
中使用相同的客户端。