python - 使用 Try 和 Except 时如何在 Python 中单元测试错误

标签 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)

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

最佳答案

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

self.assertRaises(pyodbc.Error, get_database)

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

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

关于python - 使用 Try 和 Except 时如何在 Python 中单元测试错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55618606/

相关文章:

ruby - 在静默模式下测试 Rake 任务

ruby-on-rails - rails - 如何从测试中获取夹具数据

python - 行中的 pandas 最大值并返回带有值和列名的 df

python - 是否有一个版本的 __file__ 在函数中使用时会获取使用该库的文件的名称?

python - pandas:快速计算具有某些值的列的总和

python - aiobotocore-aiohttp - 获取 S3 文件内容并将其流式传输到响应中

python - 类型错误 : Can't convert 'bytes' object to str implicitly in python

c - 升级到 Python3 - C 数据类型

python - 对一组自动化测试只运行一次 setUp

python - π 的莱布尼茨公式 - 这有什么用吗? (Python)