在对SQLAlchemy代码进行单元测试时无法理解assertRaises的结果
我正在尝试对我的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函数时,如果出现完整性错误(Integrity error)就算成功,如果没有异常发生则算失败。但是问题是,这个测试在两种情况下都成功了。
这是为什么呢?我的代码有什么问题吗?或者assertRaises的工作方式和我预期的不一样吗?
一开始我以为这是因为我在try语句中放了except,所以异常在那儿处理了,assertRaises没有捕捉到异常。如果真是这样的话,assertRaises应该在没有收到异常时失败才对。
如果我的单元测试写法有问题,请告诉我,因为我还在学习如何把单元测试融入我的编码习惯中。
1 个回答
3
你在使用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
这样会重新抛出异常(但允许事务回滚)。