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

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;
}

你可能犯了以下错误之一:

  1. 直接Mock了DBCon模块的query属性,而非getPool返回对象的query:

    // 错误示例
    jest.mock('./DBCon.js', () => ({ query: jest.fn() }));
    

    此时getPool()是undefined,调用query必然报错。

  2. Mock了getPool但未返回包含query Mock函数的对象:

    // 错误示例
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 08:02:54