使用boto3导出DynamoDB数据时单元测试遇AttributeError问题求助
核心原因
错误提示'DynamoHandler' object has no attribute 'export_table_to_point_in_time'说明你在单元测试中,错误地调用了DynamoHandler实例的该方法,而非boto3 DynamoDB客户端实例的方法。你的业务代码里是通过boto3.client("dynamodb")创建客户端调用接口,但测试代码可能误将模拟对象绑定到了DynamoHandler类,或错误直接调用了DynamoHandler的该方法。
具体修复步骤
检查测试模拟逻辑:确保单元测试中模拟的是
boto3.client("dynamodb")返回的客户端实例,而非DynamoHandler类。例如用unittest.mock的正确写法:from unittest.mock import patch, MagicMock def test_export(): with patch('boto3.client') as mock_client: # 创建模拟的DynamoDB客户端 mock_dynamodb = MagicMock() mock_dynamodb.export_table_to_point_in_time.return_value = {'ExportArn': 'test-arn'} mock_client.return_value = mock_dynamodb # 调用你的业务处理类方法 handler = DynamoHandler() handler.run_export() # 验证接口调用 mock_dynamodb.export_table_to_point_in_time.assert_called_once()确认业务代码方法归属:检查
DynamoHandler类,确保你没有误将export_table_to_point_in_time定义为类方法——它是boto3客户端的方法,应在DynamoHandler的内部方法中通过客户端实例调用,而非让DynamoHandler直接拥有该属性。验证测试环境boto3版本:在测试环境中运行以下代码,确认客户端存在该方法:
import boto3 client = boto3.client('dynamodb') print(hasattr(client, 'export_table_to_point_in_time')) # 需输出True如果输出
False,说明测试环境boto3版本低于1.33.13,需升级版本。修正测试中的对象调用:如果测试代码里写成了
handler.export_table_to_point_in_time()(直接调用DynamoHandler实例方法),会触发该错误。确保业务逻辑和测试中,都是通过boto3客户端实例调用接口。
内容的提问来源于stack exchange,提问作者mariah92

