Django REST Framework编写测试用例时如何正确传递自定义请求头
问题根因
Django(含DRF扩展的)测试客户端默认不会直接识别你传入headers字典里的自定义请求头,常见触发场景有两个:
- 如果你用的Django版本低于3.2,测试客户端根本不支持
headers关键字参数,写在这个字典里的内容会被完全丢弃 - 即使是高版本Django,混合使用
HTTP_前缀参数和headers参数传请求头时,很容易出现参数覆盖、不识别的问题
你之前已经成功传递了Authorization头,用的就是Django测试客户端原生支持的头参数写法,自定义头照着同样的规则传递即可。
修复方法
自定义请求头转成测试客户端可识别参数的规则:
- 把请求头名称里的所有横杠
-替换成下划线_ - 名称全部转为大写
- 在名称最前面加上
HTTP_前缀
你要传的platform-subscriber-id头,转换后对应的参数名是HTTP_PLATFORM_SUBSCRIBER_ID,直接作为参数传给get方法即可,修改后的代码:
class ProjectTestClass(APITestCase,URLPatternsTestCase): allow_database_queries: True def projects_notifications_list(self,token,project_key): url = reverse('projects:project_noti_list',kwargs={"category": "all"}) response = self.client.get( url, format='json', HTTP_AUTHORIZATION="JWT "+token, HTTP_PLATFORM_SUBSCRIBER_ID=project_key ) print("data -> ",response.data) self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(len(response.data), 3)
补充说明:如果确认项目用的是Django 3.2及以上版本,也可以把所有请求头都放到
headers字典里传递,不要混写两种传参方式,写法如下:response = self.client.get( url, format='json', headers={ "Authorization": f"JWT {token}", "platform-subscriber-id": project_key } )这种写法对Django版本有要求,跨版本跑测试兼容性差,日常写测试优先用
HTTP_前缀的传参方式更稳妥。
内容的提问来源于stack exchange,提问作者Ahmed Yasin
相关产品推荐
相关产品推荐

