测试update_match_video函数时遇AttributeError:'NoneType'无get属性
解决AttributeError: 'NoneType' object has no attribute 'get'问题
从你的报错和代码来看,核心问题是请求数据的结构和后端函数的预期不匹配,同时后端代码的参数判断也存在健壮性不足的问题。下面一步步拆解解决:
1. 问题根源:测试请求数据结构不符合后端预期
你的测试代码中发送的请求数据是:
match_updated_data = { 'id': 1, 'status': 'not_started', }
但后端update_match_video函数第一行就尝试获取request.data.get('match').get('id')——这说明后端期望请求数据是一个嵌套结构,顶层要有match键,里面才包含id和status。而你直接把字段放在了顶层,导致request.data.get('match')返回None,调用.get('id')时触发AttributeError。
2. 第一步:修正测试的请求数据结构
把测试中的请求数据改成后端期望的嵌套格式:
match_updated_data = { 'match': { 'id': 1, 'status': 'not_started' } }
另外注意:后端后续代码里还用到了valid_data_or_error(request.data, method='PUT')['match_data']['id'],这里的键是match_data而非match——如果valid_data_or_error是你自定义的校验函数,返回的是包含match_data的结构,那你可能需要统一请求数据的键名,比如把测试数据改成:
match_updated_data = { 'match_data': { 'id': 1, 'status': 'not_started' } }
同时修改后端开头的判断逻辑,和后续代码保持一致:
match_data = request.data.get('match_data') if not match_data or not match_data.get('id'): return JsonResponse({}, status=status.HTTP_400_BAD_REQUEST)
3. 第二步:增强后端代码的健壮性
不管请求数据结构是否正确,都应该先判断嵌套对象是否存在,再调用.get()方法,避免None报错。比如把后端开头的逻辑改成:
def update_match_video(request): # 先获取外层嵌套对象,判断是否存在 match_data = request.data.get('match') # 或者'match_data',根据实际预期调整 if not match_data or not match_data.get('id'): return JsonResponse({}, status=status.HTTP_400_BAD_REQUEST) print('request data get match id: ', match_data.get('id')) # 后续代码...
4. 额外注意:测试断言的合理性
你的测试断言是self.assertEqual(Match.objects.first().status,'live'),但看后端代码:
- 如果数据库中match的当前状态是
live,会强制把请求的status设为live - 如果当前状态是
closed,会强制设为closed
只有当当前状态既不是live也不是closed时,才会使用请求中的status值。所以要确保测试前Match.objects.first().status是not_started(或其他非live/closed状态),否则断言会失败。
内容的提问来源于stack exchange,提问作者yosra
相关产品推荐
相关产品推荐

