Jest测试依赖MySQL连接的ES6 Node.js函数报错排查
问题原因及解决方案
你遇到的报错本质是Mock层级错误:你尝试Mock的query方法并非直接挂载在DBCon模块上,而是getPool()返回的连接池对象的方法。如果没有正确MockgetPool的返回值,getPool().query就不是一个Jest Mock函数,自然没有mockImplementation方法。
常见错误场景
假设你的基础代码结构如下:
// DBCon.js import mysql from 'mysql2/promise'; export function getPool() { return mysql.createPool({ /* 数据库配置 */ }); }
// api.js import { getPool } from './DBCon.js'; export async function getProjectlist() { const pool = getPool(); const [rows] = await pool.query('SELECT * FROM projects'); return rows; }
你可能犯了以下错误之一:
直接Mock了DBCon模块的
query属性,而非getPool返回对象的query:// 错误示例 jest.mock('./DBCon.js', () => ({ query: jest.fn() }));此时
getPool()是undefined,调用query必然报错。Mock了
getPool但未返回包含queryMock函数的对象:// 错误示例 jest.mock('./DBCon.js', () => ({ getPool: jest.fn() }));此时
getPool()返回undefined,同样无法调用query的Mock方法。
正确的Mock方式
你需要让getPool返回一个带有Mockquery方法的对象,具体实现如下:
// api.test.js import { getProjectlist } from './api.js'; import { getPool } from './DBCon.js'; // 完整Mock DBCon模块,让getPool返回带query Mock的对象 jest.mock('./DBCon.js', () => ({ getPool: jest.fn(() => ({ query: jest.fn() })) })); describe('getProjectlist', () => { it('should fetch project list correctly', async () => { // 定义query的Mock返回值(匹配mysql2/promise的返回格式:[rows, fields]) const mockProjects = [{ id: 1, name: 'Demo Project' }]; getPool().query.mockResolvedValue([mockProjects]); const result = await getProjectlist(); // 验证调用逻辑 expect(getPool).toHaveBeenCalled(); expect(getPool().query).toHaveBeenCalledWith('SELECT * FROM projects'); expect(result).toEqual(mockProjects); }); });
排查步骤
如果还是报错,可以按以下步骤排查:
- 打印
getPool()的值,确认它是一个包含query属性的对象,且query是Jest Mock函数(typeof getPool().query.mockImplementation === 'function')。 - 检查Jest配置是否支持ES6模块:确保
jest.config.js中配置了正确的转换器(比如transform: { '^.+\\.js$': 'babel-jest' }),或者项目已通过package.json的type: module启用ES模块,且Jest版本支持。 - 如果你使用的是回调式的MySQL库(而非promise版本),需要将
mockResolvedValue换成mockImplementation并处理回调参数:getPool().query.mockImplementation((sql, callback) => { callback(null, mockProjects); });
内容的提问来源于stack exchange,提问作者Twizzler
相关产品推荐
相关产品推荐

