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

时间:2019-04-10 17:51:15

标签: python python-3.x unit-testing mocking monkeypatching

我正在尝试对我的功能之一进行单元测试以确保数据库连接有效,如果无效,请提出适当的异常。在给定给定的情况下,我无法测试适当的异常数据库连接无效无效

我已经成功地模拟了数据库连接,并在连接有效时获得了想要的结果。但是,尽管测试成功,但绝对不能按预期进行。当我模拟具有特定错误的数据库连接并断言引发了另一个错误时,即使它们是不同的错误,测试仍然可以通过。有关更多详细信息,请参见代码。

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)

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

1 个答案:

答案 0 :(得分:2)

pyodbc.ProgrammingErrorpyodbc.DatabaseError的子类,而pyodbc.Errorself.assertRaises(pyodbc.Error, get_database) 的子类,因此:

pyodbc.Error

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

您应具体说明要捕获的A的哪个子类。