在对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函数调用引发完整性错误,该测试应该成功,如果没有异常则失败。但问题是两种情况下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

,这将重新引发异常(但允许回滚事务)。

相关内容

  • 没有找到相关文章

最新更新