在对SQLAlchemy代码进行单元测试时无法理解assertRaises的结果

1 投票
1 回答
893 浏览
提问于 2025-04-17 06:13

我正在尝试对我的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

这样会重新抛出异常(但允许事务回滚)。

撰写回答