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

Pytest报错DID NOT RAISE <class 'Exception'>的解决方法咨询

问题原因分析

你的测试用例报错「DID NOT RAISE <class 'Exception'>」,核心原因是被测代码内部已经捕获了所有异常并处理,没有将异常向外抛出:

  • 被测函数的try-except块用except:捕获了所有异常,触发后只会执行flash错误消息、返回页面的逻辑,根本不会把异常传递到测试用例层面。
  • 你的测试用例错误地使用pytest.raises(Exception)来捕获异常,这和被测代码的实际行为完全不符。
解决方法

1. 修正测试用例逻辑

既然被测代码不会向外抛异常,测试的重点应该是验证异常场景下的响应内容(即错误flash消息),同时需要模拟数据库提交失败的场景来触发except分支。

修改后的测试用例:

def test_contact_ticket_error(client, monkeypatch):
    # 完成注册和登录流程
    client.post('/register', data={"username": "tester1", "password": "password"}, follow_redirects=True)
    client.post('/', data={"username": "tester1", "password": "password"}, follow_redirects=True)

    # 模拟数据库提交失败抛出异常
    def mock_commit():
        raise Exception("Database commit failed")
    
    # 替换真实的commit方法为模拟方法
    monkeypatch.setattr("flask_sqlalchemy._SessionCommitMixin.commit", mock_commit)

    # 发送请求,不需要捕获异常
    response = client.post("/contact/", data={
        "username":"tester1",
        "email":"tester@gmail.com",
        "details":"testing contact"
    }, follow_redirects=True)
    
    # 断言响应中包含错误提示
    assert b'There has been an issue trying to raise a contact ticket.' in response.data

2. 优化被测代码(可选但推荐)

原代码用except:捕获所有异常是不良实践,应该只捕获数据库相关的特定异常,同时添加会话回滚避免数据不一致:

from sqlalchemy.exc import SQLAlchemyError

@bp.route("/contact/", methods=["GET", "POST"])
@login_required
def contact_details():
    if request.form:
        contacts = contact(
            username=request.form.get("username"), 
            email=request.form.get("email"),
            details=request.form.get("details")
        )
        try:
            db.session.add(contacts)
            db.session.commit()
            flash("Your query has been raised successfully.")
            return redirect(url_for("main.home"))
        except SQLAlchemyError:
            db.session.rollback()  # 异常时必须回滚会话
            flash("There has been an issue trying to raise a contact ticket.")
            return render_template("main/home.html")
    return render_template("main/contact.html")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:07:39