测试抛出IntegrityError的SQLAlchemy代码的正确方法是什么?

swd*_*dev 5 python sqlalchemy

我已经阅读了这个问答,并且已经尝试在我的代码上捕获异常,这会引发IntegrityError异常,这样:

self.assertRaises(IntegrityError, db.session.commit())
Run Code Online (Sandbox Code Playgroud)

但不知何故,我的单元测试仍然失败并因IntegrityError异常而停止.我希望它说好,因为我已经预计在我的单元测试中会有异常.这是由于代码尝试插入具有相同唯一字段值的行.

任何的想法?

cod*_*ape 6

其中之一就是诀窍:

# ... only if version >= 2.7
with self.assertRaises(IntegrityError):
    db.session.commit()
Run Code Online (Sandbox Code Playgroud)

要么:

self.assertRaises(IntegrityError, db.session.commit)
Run Code Online (Sandbox Code Playgroud)

您的示例和正确方法之间的区别是:

# 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)
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用assertRaises作为上下文管理器(使用with).