我正在尝试单元测试我的sqlalchemy代码。
def add_user(*user_details):
try:
u = User(*user_details)
session.add(u)
session.commit()
except:
session.rollback()
现在在单元测试中:
def testDuplicate(self):
add_user(user_detail1,user_detail2)
self.assertRaises(IntegrityError, add_user(user_detail1,user_detail2))
如果add_user函数调用引发完整性错误,该测试应该成功,如果没有异常则失败。但问题是两种情况下test都成功了。
为什么会发生这种情况?我的代码有问题吗?或断言的工作方式与我期望的不同?
起初我认为这是发生的,因为我把except放在我的try子句中,异常只在那里处理,assertRaises不会得到异常。但是如果是这种情况,那么assertRaises应该在没有接收到异常时失败。
如果在编写单元测试的方式上有什么问题,请告诉我,因为我仍在学习将单元测试纳入我的编码习惯。
你使用assertRaises不正确,相反,你应该写:
self.assertRaises(IntegrityError, add_user, user_detail1, user_detail2)
您将函数和参数分别给assertRaises
,以便它可以控制何时调用函数(例如在assertRaises
中的try/except
块中)。
另一个问题是被测函数正在吞下错误。试着
def add_user(*user_details):
try:
u = User(*user_details)
session.add(u)
session.commit()
except:
session.rollback()
raise
,这将重新引发异常(但允许回滚事务)。