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

