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

