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

