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

使用Jest进行AWS SDK v3单元测试时遇UpdateCommand构造函数错误

解决Jest测试AWS SDK v3 UpdateCommand时的「TypeError: UpdateCommand is not a constructor」错误
  • 检查UpdateCommand的导入路径:确保业务代码中是从@aws-sdk/lib-dynamodb导入UpdateCommand,而非@aws-sdk/client-dynamodb(两个包都有同名的UpdateCommand,但你的Mock只覆盖了前者)。

  • 简化Mock代码排查问题:先将@aws-sdk/lib-dynamodb的Mock简化为最基础版本,排除复杂逻辑干扰:

    jest.mock('@aws-sdk/client-dynamodb', () => ({
      DynamoDBClient: jest.fn(() => ({})),
    }));
    
    jest.mock('@aws-sdk/lib-dynamodb', () => ({
      DynamoDBDocumentClient: {
        from: jest.fn(() => ({
          send: jest.fn().mockResolvedValue({})
        }))
      },
      GetCommand: jest.fn().mockReturnValue({ name: 'GetCommand' }),
      PutCommand: jest.fn().mockReturnValue({ name: 'PutCommand' }),
      UpdateCommand: jest.fn().mockReturnValue({ name: 'UpdateCommand' }),
      QueryCommand: jest.fn().mockReturnValue({ name: 'QueryCommand' })
    }));
    

    如果简化后错误消失,说明原Mock中的mockImplementation逻辑存在问题,比如某些分支返回了undefined(可逐一排查每个命令的Mock逻辑)。

  • 确保Mock的构造函数有效性:将UpdateCommand的Mock替换为普通构造函数,避免Jest mock函数可能的异常:

    UpdateCommand: function UpdateCommand(cmdPayload) {
      this.name = 'UpdateCommand';
      this.input = cmdPayload; // 模拟真实UpdateCommand实例的input属性
    }
    
  • 排查Mock执行顺序问题:确保测试文件中jest.mock调用没有被require语句提前加载模块。Jest会自动提升jest.mock到所有import之前,但如果使用require且在jest.mock之前调用,会导致真实模块被加载,Mock失效。

  • 移除不必要的依赖Mock:尝试删除jest.mock('@aws-sdk/client-dynamodb'),检查是否是该Mock与@aws-sdk/lib-dynamodb的Mock产生冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:25:57