DRF密码重置视图单元测试报用户不存在错误排查求助
问题根因
- Django单元测试运行时会自动创建独立的临时空数据库,测试结束后自动销毁,你没有在测试用例执行前预先创建用户名为
developer的账号,直接调用密码重置接口时,接口判断用户不存在直接返回404,没有任何用户数据被修改,后续User.objects.get(username = 'developer')自然查不到对应数据,抛出不存在异常。 - 测试代码中的接口路径写的是相对路径
login/password_reset,缺少开头的斜杠,就算提前创建了用户,也会因为请求路径错误触发404,走用户不存在的分支。 - 视图代码存在文案错误:你通过
username字段校验用户是否存在,但不存在时返回的提示是「This email address doesn't exist」,和实际校验的字段不符。
修复步骤
1. 修正单元测试代码,预创建测试用户
from rest_framework.test import APITestCase from user_authentication.models import User class ViewTest(APITestCase): # 测试用例执行前的初始化操作,预先创建测试用户 def setUp(self): self.test_user = User.objects.create_user( username="developer", email="test@example.com", password="old_pass123", # 你的User模型中date_of_birth是必填字段,必须传值 date_of_birth="2000-01-01" ) def test_password_reset(self): # 路径开头加斜杠,使用绝对路径请求 url = '/login/password_reset' response = self.client.post(url, { 'username': "developer", "new_password": "abc1234", "confirm_password": "abc1234" }) # 先校验接口返回状态符合预期,再验证密码修改结果 self.assertEqual(response.status_code, 201) # 刷新数据库中的用户数据,获取修改后的最新状态 self.test_user.refresh_from_db() self.assertTrue(self.test_user.check_password("abc1234"))
2. 可选优化:给路由加name实现路径反向解析
修改urls.py中对应路由配置,避免硬编码路径出错:
path('login/password_reset', Password_Reset.as_view(), name='password_reset')
修改测试代码中的路径获取方式:
from django.urls import reverse # 替换硬编码的路径字符串 url = reverse('password_reset')
3. 修正视图中的错误提示文案
修改views.py中404返回的提示,和实际校验字段匹配:
return Response({"message": "该用户名不存在"}, 404)
内容的提问来源于stack exchange,提问作者Noor ul ain Ibrahim
相关产品推荐
相关产品推荐

