Django单元测试报错:AttributeError: 'HttpResponse'无data属性
AttributeError: 'HttpResponse' object has no attribute 'data' 解决方法
错误原因
这个报错的核心是:Django原生的HttpResponse对象没有data属性,data是Django REST Framework(DRF)专属Response类的属性。你的测试代码里试图访问res.data,但当前请求返回的是普通HttpResponse,因此触发了属性不存在的错误。
具体修复方案
根据你的注册视图类型,分两种情况处理:
情况1:注册视图基于DRF编写
如果你的注册接口用了DRF的APIView或视图集,测试时必须用DRF提供的APIClient,而不是Django原生的Client。原生Client只能返回普通HttpResponse,APIClient则会返回DRF的Response对象,自带data属性。
- 修改你的
TestSetUp类,替换为DRF的APIClient:
# test_setup.py from rest_framework.test import APIClient from django.test import TestCase from django.urls import reverse class TestSetUp(TestCase): def setUp(self): # 用DRF的APIClient替换Django原生Client self.client = APIClient() self.register_url = reverse('你的注册URL名称') self.user_data = { 'email': 'test@example.com', 'username': 'testuser', 'password': 'testpass123' } super().setUp()
- 测试方法可保留原有的
res.data写法:
def test_user_can_register_successfully(self): res = self.client.post( self.register_url, self.user_data, format="json") self.assertEqual(res.data['email'], self.user_data['email']) self.assertEqual(res.data['username'], self.user_data['username']) self.assertEqual(res.status_code, 201)
情况2:注册视图是Django原生视图
如果你的视图用的是Django原生View,返回的是JsonResponse或普通HttpResponse,需要通过json()方法解析响应体,而非直接访问data:
修改测试方法如下:
def test_user_can_register_successfully(self): # 原生Client用json参数传递数据,自动设置content_type res = self.client.post(self.register_url, json=self.user_data) # 解析响应体为字典 response_data = res.json() self.assertEqual(response_data['email'], self.user_data['email']) self.assertEqual(response_data['username'], self.user_data['username']) self.assertEqual(res.status_code, 201)
额外检查点
- 确认注册视图的返回类型:如果用DRF,需确保视图继承自
APIView或DRF其他基类,且返回Response对象。 - 原生Client的
format="json"参数无效,建议用json参数传递数据,或手动设置content_type="application/json"并序列化数据。
内容的提问来源于stack exchange,提问作者user5095215
相关产品推荐
相关产品推荐

