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

从TypeORM迁移至Prisma:单元测试中Prisma函数返回undefined问题

Prisma单元测试Mock函数返回undefined问题

我正从TypeORM迁移到Prisma,单元测试中所有Prisma函数均返回undefined,已采用Prisma官方的依赖注入方案实现。

测试代码

const mockCtx2 = createMockContext()
const ctx2 = mockCtx2 as unknown as Context
console.log("createDummyUser")
console.log(ctx2)
console.log(ctx2.prisma)
console.log(ctx2.prisma.users)

控制台输出

console.log
  { prisma: { _isMockObject: true } }

    at test/userService.test.ts:889:15

console.log
  { _isMockObject: true }

    at test/userService.test.ts:890:15

console.log
  [Function: mockConstructor] {
    _isMockFunction: true,
    getMockImplementation: [Function (anonymous)],
    mock: [Getter/Setter],
    mockClear: [Function (anonymous)],
    mockReset: [Function (anonymous)],
    mockRestore: [Function (anonymous)],
    mockReturnValueOnce: [Function (anonymous)],
    mockResolvedValueOnce: [Function (anonymous)],
    mockRejectedValueOnce: [Function (anonymous)],
    mockReturnValue: [Function (anonymous)],
    mockResolvedValue: [Function (anonymous)],
    mockRejectedValue: [Function (anonymous)],
    mockImplementationOnce: [Function (anonymous)],
    mockImplementation: [Function (anonymous)],
    mockReturnThis: [Function (anonymous)],
    mockName: [Function (anonymous)],
    getMockName: [Function (anonymous)],
    calledWith: [Function (anonymous)],
    _isMockObject: true
  }

所有Prisma请求均返回undefined,示例:

const allUsers1 = await ctx2.prisma.users.findMany()
console.log(allUsers1) // 输出undefined

更新内容

直接使用真实Prisma Client测试可正常返回数据:

import prisma from '../client'

const u = await prisma.users.findMany()
console.log("****")
console.log(u) // 正常输出用户列表

client.ts代码:

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient()
export default prisma

问题原因与解决办法

问题出在createMockContext生成的是空Mock对象,所有Prisma模型的方法默认未设置返回值,因此调用后返回undefined。真实Client能正常工作说明数据模型和Client配置无问题,仅需完善单元测试的Mock设置。

具体解决步骤

  1. 为Mock方法指定返回值
    使用mockResolvedValue(异步方法)或mockReturnValue(同步方法)给需要测试的Prisma方法设置模拟数据:

    const mockCtx2 = createMockContext()
    // 为users.findMany设置模拟返回数据
    mockCtx2.prisma.users.findMany.mockResolvedValue([
      { id: 1, username: 'test_user', email: 'test@example.com' }
    ])
    
    const ctx2 = mockCtx2 as unknown as Context
    const allUsers1 = await ctx2.prisma.users.findMany()
    console.log(allUsers1) // 输出模拟的用户数组
    
  2. 清理Mock状态避免测试污染
    在每个测试用例执行前清空Mock的调用记录,防止测试间互相干扰:

    beforeEach(() => {
      mockCtx2.prisma.users.findMany.mockClear()
      // 其他需要测试的Prisma方法也需一并清空
    })
    
  3. 复杂场景的自定义Mock逻辑
    若需测试条件查询、创建、更新等复杂操作,可使用mockImplementation自定义逻辑:

    mockCtx2.prisma.users.findUnique.mockImplementation(async (args) => {
      // 根据传入的查询参数返回对应模拟数据
      if (args.where.id === 1) {
        return { id: 1, username: 'test_user' }
      }
      return null
    })
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:05:29