【问题标题】:assertRaises not catching IntegrityError , Flask SQLAlchemyassertRaises 没有捕获 IntegrityError ,Flask SQLAlchemy
【发布时间】:2015-12-21 21:26:43
【问题描述】:

我的测试没有用 assertRaises 捕获 psycopg2.IntegrityError。我正在使用 Flask-SQLAlchemy。

def test_insert_cash_flow(self):
    cf = CashFlow()
    db.session.add(cf)
    self.assertRaises(psycopg2.IntegrityError, db.session.commit)

我的 CashFlow SQLAlchemy 模型有几个 nullable=False 字段。它说我的测试失败并且 IntegrityError 被打印到屏幕上,但我的 assertRaises 没有捕捉到这一点。有人怀疑为什么吗?

【问题讨论】:

  • 奇怪……确实。您是否尝试在文档中概述的 with 语句中使用 self.assertRaises? docs.python.org/2/library/unittest.html
  • 你确定你有db.session.commit而不是db.session.commit()
  • 是的,我尝试过使用 with 语句,但同样失败。是的,我确定我有 db.session.commit 没有 ()

标签: python unit-testing flask sqlalchemy assert


【解决方案1】:

SQLAlchemy 引发 sqlalchemy.exc.IntegrityError,它封装了底层异常,而不是来自数据库驱动程序的异常。

sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) NOT NULL constraint failed: user.name [SQL: 'INSERT INTO user (name) VALUES (?)'] [parameters: (None,)]

测试正确的异常。

from sqlalchemy.exc import IntegrityError
self.assertRaises(IntegrityError, db.session.commit)

【讨论】:

    猜你喜欢
    • 2014-08-22
    • 2016-03-05
    • 2016-10-16
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2014-09-22
    相关资源
    最近更新 更多