Jest Mock Prisma数据库写入返回undefined问题
问题根因
核心问题共3点:
- Mock方法完全不匹配:业务逻辑中实际调用的是
pcc_webhook_update模型的upsert方法完成新建/更新逻辑,但测试用例中仅Mock了create方法的返回值。首先Prisma Client的upsert是独立的顶层方法,不会在内部调用同模型的create方法,Mockcreate本身就不会被触发;其次jest-mock-extended的mockDeep生成的深层Mock对象,未显式配置返回值的异步方法默认返回undefined,因此await prismaClinical.pcc_webhook_update.upsert(...)直接拿到undefined,最终函数返回结果和预期不符。 - Mock文件存在顺序隐患:
prisma-clinical-mock.ts中beforeEach钩子注册时,引用的prismaClinicalMock变量在后续行才定义,虽然回调延迟执行不会立刻报错,但不符合代码执行顺序规范,后续调整时极易出现引用错误。 - 业务代码错误处理逻辑有缺陷:
catch块仅打印错误、没有抛出异常或显式返回错误值,一旦Mock逻辑或业务执行抛错,函数会静默返回undefined,直接掩盖真实报错原因,增加排查难度。
修复步骤
1. 修正测试用例的Mock目标
将原来Mockcreate的逻辑改为Mock业务实际调用的upsert方法:
// 原错误写法 // prismaClinicalMock.pcc_webhook_update.create.mockResolvedValue(allergyAddRecord); // 改为匹配实际调用的upsert方法 prismaClinicalMock.pcc_webhook_update.upsert.mockResolvedValue(allergyAddRecord);
如果后续需要区分upsert走的是新建分支还是更新分支,可以通过mockImplementation根据入参返回不同值:
prismaClinicalMock.pcc_webhook_update.upsert.mockImplementation(async (args) => { // 可根据args.create/args.update判断逻辑分支,返回对应mock数据 return allergyAddRecord; });
2. 调整Mock文件的代码顺序
修正prisma-clinical-mock.ts的变量定义顺序,消除隐式引用隐患:
import { PrismaClient } from '../prisma/generated/clinical'; import { mockDeep, mockReset, DeepMockProxy } from 'jest-mock-extended'; import prisma from '../prisma/clinical-client'; jest.mock('../prisma/clinical-client', () => ({ __esModule: true, default: mockDeep<PrismaClient>() })); // 先定义mock实例 export const prismaClinicalMock = prisma as unknown as DeepMockProxy<PrismaClient>; // 再注册重置钩子 beforeEach(() => { mockReset(prismaClinicalMock); });
3. 优化业务代码错误处理
不要吞掉错误,避免出现问题时静默返回undefined:
} catch (error) { console.error(error); throw error; // 抛出错误让调用方/测试框架直接感知异常 }
内容的提问来源于stack exchange,提问作者autoboxer
相关产品推荐
相关产品推荐

