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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:36:08