Jest.js 为什么我的Prisma单元测试调用我的数据库

nkhmeac6  于 2023-08-01  发布在  Jest
关注(0)|答案(1)|浏览(135)

我为一个在数据库中创建数据的函数编写了一个单元测试。我根据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,
  })
})


考虑到这些文件与指南中的示例非常接近,我希望我编写的测试不会调用数据库。如何防止在运行测试时调用数据库?

fykwrbwg

fykwrbwg1#

也遇到了这个问题。我使用了整个应用程序中使用的相同的prisma客户端,它可以正确地模拟。

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

import prisma from './prsma.js' //In your case

jest.mock('./prsma.js', () => ({ //In your case
  __esModule: true,
  default: mockDeep<PrismaClient>(),
}))

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

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

字符串
如果您已经在./lib/prisma.ts中有一个导出的prisma客户端,用于调用数据库,请在.singleton.ts中使用相同的客户端。

相关问题