从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设置。
具体解决步骤
为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) // 输出模拟的用户数组清理Mock状态避免测试污染
在每个测试用例执行前清空Mock的调用记录,防止测试间互相干扰:beforeEach(() => { mockCtx2.prisma.users.findMany.mockClear() // 其他需要测试的Prisma方法也需一并清空 })复杂场景的自定义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
相关产品推荐
相关产品推荐

