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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:42:18