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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:12:13