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

CDK Jest测试报错:无法实例化继承抽象类的MyLambdaStack

解决TypeError: MyLambdaStack is not a constructor问题

问题场景

我定义了继承自cdk.Stack的类:

export class AbstractClass extends cdk.Stack {
    constructor(scope: Construct, id: string, props: SomeProps) {
        super(scope, id, props);
        // 内部逻辑
    }
}

子类继承该类:

export class MyLambdaStack extends AbstractClass {
    constructor(scope: Construct, id: string, props: SomeProps) {
        super(scope, id, props);
        // 内部逻辑
    }
}

编写测试代码(MyLambdaStack.test.ts)时:

describe("AskEC2 Health Monitor Lambda Stack", () => {
    const app = new App();
    const props: SomeProps = {...};
    const myLambdaStack = new MyLambdaStack(app, `test-id`, props);

    test("Placeholder test", () => {});
});

持续报错:

TypeError: MyLambdaStack_1.MyLambdaStack is not a constructor

已知直接实例化AbstractClass一切正常,怀疑问题出在继承关系上。

解决方法

  • 检查导入导出是否匹配
    确保测试文件里的导入语句和子类的导出方式一致。如果子类用的是命名导出(export class MyLambdaStack),测试里必须用命名导入:

    import { MyLambdaStack } from '../src/MyLambdaStack';
    

    别把命名导出和默认导出搞混,比如子类如果是export default class MyLambdaStack,测试里就要用import MyLambdaStack from '../src/MyLambdaStack'。

  • 验证TypeScript编译配置
    打开tsconfig.json检查关键配置:

    • compilerOptions.module设为CommonJS(适配Jest等Node环境的测试框架)
    • outDir路径正确,确保编译后的JS文件能被测试框架找到
    • 开启strict模式后,检查是否有隐式类型错误导致编译失败,比如父类构造函数的参数是否被子类完整传递
  • 排查循环依赖问题
    检查AbstractClass和MyLambdaStack之间是否存在循环导入(比如父类导入了子类的模块,子类又导入父类的其他关联模块),循环依赖会导致类无法正确初始化,出现构造函数未定义的错误。

  • 确认测试框架的模块解析配置
    如果用Jest,检查jest.config.js:

    • 确保moduleFileExtensions包含ts、tsx
    • 配置ts-jest作为转换器,比如:
      module.exports = {
        preset: 'ts-jest',
        testEnvironment: 'node',
        moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
      };
      
  • 清理缓存重新编译
    删除项目的编译输出目录(比如dist)和node_modules/.cache文件夹,然后重新执行tsc编译,再运行测试,避免旧缓存代码干扰。

  • 检查父类的抽象类声明
    如果你的AbstractClass是打算作为抽象类使用,记得加上abstract关键字:

    export abstract class AbstractClass extends cdk.Stack {
        // ...
    }
    

    虽然你说直接实例化父类正常,但如果父类是真正的抽象类,直接实例化会报错,这可能意味着之前的测试存在隐藏问题,确认子类是否实现了父类所有的抽象方法。

内容的提问来源于stack exchange,提问作者Anurag Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 20:22:40