Django测试出现AssertionError:404 != 200问题求助
排查Django测试中AssertionError: 404 != 200的问题
我来帮你分析这个404错误的可能原因,以及对应的解决办法:
最可能的原因:硬编码主键导致资源找不到
你的测试代码里用了硬编码的pk=1请求状态详情:
response = self.client.get(reverse("status-detail", kwargs={"pk": 1}))
虽然理论上setUp创建的self.status主键应该是1,但Django测试环境每次运行时,数据库主键序列可能因前置测试(哪怕是同一测试类的其他方法)出现偏移,或者特殊场景下主键并非1,导致请求的资源不存在。
解决方法:
把硬编码的pk=1替换为self.status.pk,确保请求的是你在setUp中创建的目标状态对象:
response = self.client.get(reverse("status-detail", kwargs={"pk": self.status.pk}))
第二个可能原因:认证失效导致无法访问资源
如果你的ProfileStatusViewSet设置了权限控制(比如仅允许认证用户访问,或仅允许查看自身状态),但api_authentication方法未正确设置请求头的Token,请求会以匿名用户身份发送,视图无法找到属于测试用户的状态,最终返回404。
检查方法:
确认api_authentication方法是否正确实现了Token认证:
def api_authentication(self): self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token.key)
如果该方法未正确设置HTTP_AUTHORIZATION请求头,请求将不带认证信息,视图会过滤掉匿名用户可访问的资源,导致404。
第三个可能原因:视图集查询集过滤逻辑问题
如果ProfileStatusViewSet的get_queryset方法做了用户过滤(比如仅返回当前登录用户的状态):
def get_queryset(self): return ProfileStatus.objects.filter(user_profile=self.request.user.profile)
那么若认证失败(上述第二个问题),或user_profile关联有误,都会导致查询集为空,返回404。
检查方法:
- 确认
setUp中self.user.profile是否存在(比如是否通过信号自动创建了Profile对象) - 确认
ProfileStatus模型的user_profile外键是否正确关联到Profile模型
辅助验证步骤
你可以在测试方法中添加打印语句,查看请求URL和响应内容,进一步定位问题:
def test_single_status_retrieve(self): serializer_data = ProfileStatusSerializer(instance=self.status).data url = reverse("status-detail", kwargs={"pk": self.status.pk}) print(f"请求URL: {url}") print(f"Status对象PK: {self.status.pk}") response = self.client.get(url) print(f"响应内容: {response.content}") self.assertEqual(response.status_code, status.HTTP_200_OK) response_data = json.loads(response.content) self.assertEqual(serializer_data, response_data)
内容的提问来源于stack exchange,提问作者AnonymousUser
相关产品推荐
相关产品推荐

