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
相关产品推荐
相关产品推荐

