使用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
相关产品推荐
相关产品推荐

