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

FastAPI中如何测试使用数据库不存在令牌的密码重置端点?

密码重置功能单元测试的令牌场景处理方案

针对你遇到的无效令牌测试场景,以及有效令牌的测试需求,分场景处理更清晰:

1. 测试无效令牌的场景(当前代码的情况)

你现在用的是数据库中不存在的cozy_token,这时候不需要模拟有效令牌,核心是验证系统对无效令牌的错误处理逻辑:

  • 先修正当前测试的错误断言:无效令牌正常应该返回400/401这类错误状态码,而非200
  • 调整后的测试代码示例:
def test_web_reset_password_invalid_token():
    payload = {
        "token": "cozy_token",  # 数据库中不存在的令牌
        "new_password": "NewSecret123!"
    }
    response = client.post(f"{WEB_ENDPOINT}/reset-password", json=payload)
    # 断言错误状态码,比如400 Bad Request,具体按你的业务逻辑调整
    assert response.status_code == 400
    data = response.json()
    assert "detail" in data  # FastAPI默认会返回detail字段说明错误
    assert data["detail"] == "无效或已过期的重置令牌"  # 匹配你的业务错误提示

2. 测试有效令牌的场景

如果要验证正常的密码重置流程,有两种可选方案:

方案一:模拟令牌验证流程(单元测试首选,隔离依赖)

用pytest-mock或unittest.mock模拟令牌验证的核心函数,让它直接返回合法的用户ID,不需要真的生成令牌存入数据库:

def test_web_reset_password_valid_token_mocked(mocker):
    # 模拟你的令牌验证函数,假设函数名为verify_reset_token
    mock_verify = mocker.patch("your_project.auth.verify_reset_token")
    mock_verify.return_value = 123  # 返回测试用的用户ID

    payload = {
        "token": "any_random_token",  # 随便填,因为验证逻辑已被Mock
        "new_password": "NewSecret123!"
    }
    response = client.post(f"{WEB_ENDPOINT}/reset-password", json=payload)
    assert response.status_code == 200
    data = response.json()
    assert data["status"] == "success"
    # 可选:断言数据库中对应用户的密码已更新

方案二:真实生成有效令牌(集成测试用,覆盖完整流程)

如果要测试端到端的完整流程,先调用密码重置请求接口生成真实令牌,再用该令牌测试重置接口:

def test_web_reset_password_full_flow():
    # 第一步:调用忘记密码接口生成重置令牌
    forgot_payload = {"email": "test_user@example.com"}
    forgot_response = client.post(f"{WEB_ENDPOINT}/forgot-password", json=forgot_payload)
    assert forgot_response.status_code == 200

    # 第二步:从测试数据库中取出刚生成的令牌
    reset_token = get_reset_token_from_db(email="test_user@example.com")

    # 第三步:用真实令牌执行密码重置
    reset_payload = {
        "token": reset_token,
        "new_password": "NewSecret123!"
    }
    reset_response = client.post(f"{WEB_ENDPOINT}/reset-password", json=reset_payload)
    assert reset_response.status_code == 200
    data = reset_response.json()
    assert data["status"] == "success"

总结

  • 测试无效令牌:直接使用不存在的令牌,验证系统返回正确的错误响应
  • 测试有效令牌:优先用模拟验证流程(单元测试,速度快且隔离依赖);若要覆盖完整业务流程,再用真实生成令牌的方式

内容的提问来源于stack exchange,提问作者Hiroshi Ashikaga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:38:14