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

Jest中mssql Mock移至__mocks__文件夹报错:ConnectionPool非构造函数

错误原因分析

这个错误的核心是你在__mocks__文件夹中模拟的mssql模块导出结构,和真实mssql库的导出结构不匹配:

  • 真实的mssql库在TypeScript环境下,主API是通过export default导出的对象,ConnectionPool是这个默认导出对象的属性;
  • 当你把mock逻辑移到__mocks__文件夹后,没有正确模拟这个默认导出的层级结构,导致代码中mssql.default.ConnectionPool找不到对应的构造函数。
正确转换为共享__mocks__项的步骤

1. 对齐原有效mock的导出结构

先回顾你之前能正常运行的jest.mock()第二个参数的代码,比如原代码可能是这样:

jest.mock('mssql', () => ({
  default: {
    ConnectionPool: jest.fn().mockImplementation(() => ({
      connect: jest.fn().mockResolvedValue({}),
      request: jest.fn().mockReturnValue({
        input: jest.fn().mockReturnThis(),
        query: jest.fn().mockResolvedValue({ recordset: [] })
      }),
      close: jest.fn().mockResolvedValue({})
    }))
  }
}));

你需要把这个结构完整复制到__mocks__/mssql.ts中,保证导出层级一致。

2. 编写__mocks__/mssql.ts文件

根据业务代码的导入方式,选择对应的导出风格:

情况1:业务代码用默认导入(import mssql from 'mssql')

import jest from 'jest';

// 模拟ConnectionPool类的行为
const MockConnectionPool = jest.fn().mockImplementation(() => ({
  connect: jest.fn().mockResolvedValue({}),
  request: jest.fn().mockReturnValue({
    input: jest.fn().mockReturnThis(),
    query: jest.fn().mockResolvedValue({ recordset: [] })
  }),
  close: jest.fn().mockResolvedValue({})
}));

// 完全匹配真实库的默认导出结构
export default {
  ConnectionPool: MockConnectionPool
};

// 如果业务代码用到了mssql的其他命名导出,也要一并模拟
export const connect = jest.fn().mockResolvedValue({});

情况2:业务代码用命名导入(import { ConnectionPool } from 'mssql')

除了默认导出,还要添加对应的命名导出,确保两种导入方式都能生效:

import jest from 'jest';

const MockConnectionPool = jest.fn().mockImplementation(() => ({
  connect: jest.fn().mockResolvedValue({}),
  request: jest.fn().mockReturnValue({
    input: jest.fn().mockReturnThis(),
    query: jest.fn().mockResolvedValue({ recordset: [] })
  }),
  close: jest.fn().mockResolvedValue({})
}));

// 默认导出
export default {
  ConnectionPool: MockConnectionPool
};

// 命名导出,匹配真实库的结构
export { MockConnectionPool as ConnectionPool };

3. 验证Jest模块解析配置

确保你的tsconfig.json中,moduleResolution设置为Node或NodeNext,这样Jest能正确识别__mocks__文件夹中的模拟模块,同时保证TypeScript能正确解析导出结构。

4. 测试验证

移除代码中的jest.mock('mssql', ...)手动mock,直接运行测试,Jest会自动加载__mocks__/mssql.ts中的模拟实现,此时应该能正常运行,不会再出现ConnectionPool is not a constructor的错误。

内容的提问来源于stack exchange,提问作者Nate Rardin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 08:34:54