Jest报错:Server类构造函数无法识别为构造函数问题求助
我定义了一个包含initRoutes方法的Server类,它依赖的Router、Service、Database类的Jest单元测试都正常。但编写Server类的测试时,只要启用initRoutes函数就会触发报错:TypeError: server_service_1.Server is not a constructor。直接运行服务没有异常,求解决办法。
相关代码
Server类代码
export class Server { app: Express; checklistRouter: ChecklistRouter; dateRouter: DateRouter; // 注:原代码此处类型写错,应为DateRouter <...> constructor(){ this.app = express(); this.checklistRouter = new ChecklistRouter(new ChecklistService(checklistDatabase)); this.dateRouter = new DateRouter(new DateService(dateDatabase)); } initRoutes() { this.app.use('/', this.checklistRouter.getRouter()); this.app.use('/', this.dateRouter.getRouter()); } <... 其他函数 > }
测试代码
import { Server } from '../../src/services/server.service'; describe('Server tests', () => { const server = new Server(); it('Should create "Server" instance', () => { expect(server).toBeInstanceOf(Server); }); })
报错信息
tests/unit/server.test.ts - Test suite failed to run TypeError: server_service_1.Server is not a constructor
以下是几种实用的排查和修复方向:
检查模块导出导入的兼容性:
确认server.service.ts的导出方式,如果是默认导出,测试里要改成import Server from '../../src/services/server.service';(去掉花括号)。同时检查tsconfig.json的module配置,保证测试和生产环境的模块格式一致(比如都是ESNext或CommonJS)。排查循环依赖:
虽然依赖类的测试正常,但Server初始化时可能触发了循环引用。检查ChecklistRouter/DateRouter或它们的依赖链是否反向引用了Server。另外可以把Server实例的初始化移到it块内部,避免模块加载阶段就触发所有依赖:describe('Server tests', () => { it('Should create "Server" instance', () => { const server = new Server(); expect(server).toBeInstanceOf(Server); }); })验证Jest的模块解析配置:
检查jest.config.js里的moduleDirectories、modulePaths是否正确,确保Jest能找到目标模块。也可以尝试在导入路径里加上.ts后缀,排查是否是后缀匹配问题。隔离
initRoutes的依赖问题:
报错提示的内容可能是表象,实际是initRoutes调用时某个依赖出错导致模块加载失败。可以单独测试getRouter方法在测试环境下的可用性,或者用jest.mock手动模拟Router和Service的实例,隔离外部依赖:import { Server } from '../../src/services/server.service'; import { ChecklistRouter } from '../../src/routes/checklist.router'; import { DateRouter } from '../../src/routes/date.router'; jest.mock('../../src/routes/checklist.router', () => ({ ChecklistRouter: jest.fn().mockImplementation(() => ({ getRouter: jest.fn().mockReturnValue({}) })) })); jest.mock('../../src/routes/date.router', () => ({ DateRouter: jest.fn().mockImplementation(() => ({ getRouter: jest.fn().mockReturnValue({}) })) })); describe('Server tests', () => { it('Should create "Server" instance', () => { const server = new Server(); expect(server).toBeInstanceOf(Server); }); it('Should initialize routes correctly', () => { const server = new Server(); const useSpy = jest.spyOn(server.app, 'use'); server.initRoutes(); expect(useSpy).toHaveBeenCalledTimes(2); }); })
内容的提问来源于stack exchange,提问作者Tabea

