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

使用prismock测试Prisma的queryRawUnsafe无返回结果问题求助

问题

使用prismock测试调用$queryRawUnsafe的函数时出现异常:

  • 调用await DBConn.table_name.findMany()能正常返回所有记录
  • 调用await DBConn.$queryRawUnsafe('SELECT * FROM table_name')返回空值,无任何报错信息

当前模拟Prisma Client的代码:

jest.mock('@prisma/client', () => {
    return {
        ...jest.requireActual('@prisma/client'),
        PrismaClient: jest.requireActual('prismock').PrismockClient,
    };
});

推测是prismock无法识别$前缀的原生查询方法导致的问题,求解决办法。

解决方法

方案1:手动扩展PrismockClient实现$queryRawUnsafe

prismock默认未实现$queryRawUnsafe这类原生查询方法,可通过继承扩展来添加模拟逻辑:

jest.mock('@prisma/client', () => {
  const actual = jest.requireActual('@prisma/client');
  const PrismockClient = jest.requireActual('prismock').PrismockClient;

  class ExtendedPrismockClient extends PrismockClient {
    async $queryRawUnsafe(sql) {
      // 解析简单SELECT语句,映射到prismock内置的findMany方法
      const tableMatch = sql.match(/SELECT \* FROM (\w+)/i);
      if (tableMatch) {
        const tableName = tableMatch[1];
        return this[tableName].findMany();
      }
      // 其他类型SQL可根据需求补充处理逻辑
      return [];
    }
  }

  return {
    ...actual,
    PrismaClient: ExtendedPrismockClient,
  };
});

方案2:用jest.spyOn单独模拟$queryRawUnsafe

针对特定测试用例,直接mock目标方法返回定制数据:

import { DBConn } from './your-db-connection-module';

beforeEach(() => {
  jest.spyOn(DBConn, '$queryRawUnsafe').mockImplementation(async (sql) => {
    if (sql.includes('SELECT * FROM table_name')) {
      return [{ id: 1, name: 'test' }, { id: 2, name: 'demo' }];
    }
    return [];
  });
});

afterEach(() => {
  jest.restoreAllMocks();
});

方案3:更换支持原生查询的mock库

若prismock的原生查询支持无法满足需求,可替换为官方的@prisma/client/testing工具,或prisma-mock等对原生查询方法支持更完善的mock库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 20:27:18