5

我已经阅读了这个问答,并且已经尝试在我的代码中捕获引发 IntegrityError 异常的异常,这种方式:

self.assertRaises(IntegrityError, db.session.commit())

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

任何想法?

4

1 回答 1

6

其中之一将是诀窍:

# ... 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)。

于 2013-10-10T07:18:49.980 回答