使用Pytest Stub测试DynamoDB put_item遇类型错误及参数疑问
解决Pytest+Stub测试DynamoDB put_item的两个问题
咱们先搞定你遇到的TypeError,再聊聊add_response里expected_parameters的配置方法。
一、修复TypeError: Unsupported type "<class 'function'>"
这个错误的根源很明确:你在item_fake fixture里直接引用了aws_request_id_fake这个fixture函数对象,而不是获取它返回的字符串值。Pytest的fixture需要通过参数注入的方式来使用,不能直接把fixture函数名当值用。
修改后的Fixture代码
import pytest @pytest.fixture(scope='module') def aws_request_id_fake(): return 'xyz789' # 补充messageid_fake的示例(假设你之前是类似定义) @pytest.fixture(scope='module') def messageid_fake(): return 'msg-abc123' @pytest.fixture(scope='module') def item_fake(aws_request_id_fake, messageid_fake): # 通过参数注入获取两个fixture的返回值,而非直接引用函数 return { 'aws_request_id': aws_request_id_fake, 'messageId': messageid_fake }
这样修改后,Pytest会自动把aws_request_id_fake和messageid_fake的返回值注入到item_fake中,赋值给字典的对应键,就不会再出现函数类型的错误了。
二、正确配置add_response的expected_parameters参数
这个参数的作用是校验实际调用DynamoDB put_item时传入的参数是否和预期一致,它的结构必须和Boto3调用put_item的参数完全匹配,核心注意点是参数名的驼峰命名规则(DynamoDB的API参数都是驼峰,不是下划线分隔)。
修正后的expected_params
expected_params = { 'Item': item_fake, 'ConditionExpression': condition_expression_fake, # 去掉下划线,采用驼峰命名 'ReturnValues': return_values_fake, 'ReturnConsumedCapacity': return_consumed_capacity_fake, 'ReturnItemCollectionMetrics': return_item_metrics_fake # 首字母大写,驼峰格式 }
配置的关键规则
- 严格匹配Boto3参数名:要和Boto3中
dynamodb.Table.put_item方法的参数名完全一致(比如ConditionExpression而非Condition_Expression,ReturnItemCollectionMetrics而非小写的return_item_collection_metrics)。 - 按需校验参数:如果某些参数是可选的,你可以只列出你关心的参数,Stub会忽略未列出的可选参数;但如果实际调用时传入了不在
expected_params中的参数,Stub会抛出参数不匹配的错误。 - Item的格式匹配:如果你用的是DynamoDB Resource(不是Client),
Item参数直接用原生Python字典即可(比如{'aws_request_id': 'xyz789'}),不需要像Client那样加类型标识(比如{'aws_request_id': {'S': 'xyz789'}})。
额外注意点
你调用put_item_dynamodb_table时传的是item=[item_fake],但DynamoDB的put_item的Item参数是单个字典,不是列表。如果你的put_item_dynamodb_table函数内部没有把列表转成单个字典,这里会导致参数不匹配,建议检查这个函数的实现逻辑。
内容的提问来源于stack exchange,提问作者sandy
相关产品推荐
相关产品推荐

