使用 Try 和 Except 时如何对 Python 中的错误进行单元测试

How to Unit Test errors in Python when using Try and Except

我正在尝试对我的一个函数进行单元测试,以确保数据库连接有效,如果无效,请提出正确的 exception.I 我很难测试是否正确鉴于数据库连接 not valid

引发异常

我已经成功模拟了数据库连接,并在连接有效时得到了我想要的结果。然而,尽管测试成功,它肯定没有按预期工作。当我用特定错误模拟数据库连接并断言引发了另一个错误时,即使它们是不同的错误,测试仍然通过。有关更多详细信息,请参阅代码。

def get_database():
    try:
        conn = pyodbc.connect(
            r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};'
            r'DBQ=M:\Path\To\Database\My_Database.accdb;'
        )
        return conn
    # I want to assert this specific error is raised given bad connection
    except pyodbc.Error as err: 
        raise err

@mock.patch('directory1.script1.pyodbc.connect')
def test_database_connection_error(self, mock_conn):

        # If connection is valid test works as intended!
        get_database()
        mock_conn.assert_called_once_with((
            r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};'
            r'DBQ=M:\Path\To\Database\My_Database.accdb;'
        ))

        # This test still passes even though the errors are different!
        mock_conn.side_effect = pyodbc.ProgrammingError
        self.assertRaises(pyodbc.Error, get_database)

我希望如果模拟数据库连接设置为一种类型的错误并且断言另一种错误,那么测试应该会失败。事实并非如此。

pyodbc.ProgrammingErrorpyodbc.DatabaseError 的子类,pyodbc.DatabaseErrorpyodbc.Error 的子类,所以你的:

self.assertRaises(pyodbc.Error, get_database)

只要引发 pyodbc.Error 的子类的任何异常实例,包括 pyodbc.DatabaseError,它就会通过。

您应该具体说明要捕获 pyodbc.Error 的哪个子类。