我已经阅读了 这篇 问答,并尝试在我的代码中捕获引发IntegrityError异常的异常,如下:
self.assertRaises(IntegrityError, db.session.commit())
但是,我的单元测试仍然失败,并停止于IntegrityError异常。我希望它显示OK,因为我已经预期在我的单元测试中出现异常。 这是由尝试插入具有相同唯一字段值的行的代码引起的。
有什么想法吗?
我已经阅读了 这篇 问答,并尝试在我的代码中捕获引发IntegrityError异常的异常,如下:
self.assertRaises(IntegrityError, db.session.commit())
# ... only if version >= 2.7
with self.assertRaises(IntegrityError):
db.session.commit()
或者:
self.assertRaises(IntegrityError, db.session.commit)
# Your example: You call db.session.commit(), this will raise an exception before
# assertRaises is called
self.assertRaises(IntegrityError, db.session.commit())
# Correct way: Pass what should be called to assertRaises,
# let assertRaises invoke it and check for exception
self.assertRaises(IntegrityError, db.session.commit)
我更喜欢使用assertRaises作为上下文管理器(使用with
)。
async with async_session_maker(autocommit=True) as session:
with pytest.raises(sqlalchemy.exc.IntegrityError):
sqlachemy.execute(statement_which_violates_foreign_key_contstraint)
问题出现在一个会话块和pytest块的订单上。异常将在session.commit()
语句上引发,该语句隐藏在AsyncSession的__aexit__
方法中。
解决方案 - 改变顺序:
with pytest.raises(sqlalchemy.exc.IntegrityError):
async with async_session_maker(autocommit=True) as session:
sqlachemy.execute(statement_which_violates_foreign_key_contstraint)