You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

检查方法:

  1. 确认setUp中self.user.profile是否存在(比如是否通过信号自动创建了Profile对象)
  2. 确认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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 17:54:09