首页 > 解决方案 > 在 Python 中测试函数时如何引发错误

问题描述

我正在尝试做一个非常简单的测试,其中我的函数接受一个参数,一个数据库路径,尝试使用 pyodbc.connect(database path) 连接到数据库,如果路径无效会引发错误。但是,由于我的测试目前是结构化的,当我通过正在测试的函数时,我无法使测试通过(引发错误)。

我试图通过使用模拟和不使用模拟的测试。我相信正确的方法是使用模拟,但是我也无法让它工作(见下面的代码)。我发现了与我遇到的问题类似的问题,但我无法使用这些问题中的建议来让我的测试正常工作。

被测功能

import pyodbc

# When function runs by itself (no test) pyodbc.InterfaceError is raised if database path is bad! 
def connect_to_database(database):  
    try:
        conn = pyodbc.connect(database)
        return conn
    except pyodbc.InterfaceError as err:
        raise err

测试

没有嘲笑

def test_invalid_path_to_database(self):
    self.assertRaises(pyodbc.InterfaceError, connect_to_database, '')

带着嘲讽

def setUp(self):
    self.mock_conn= mock.patch('my_package.my_module.pyodbc.connect').start()
        self.addCleanup(mock.patch.stopall)

def test_invalid_path_to_database(self):
    self.mock_conn.side_effect = pyodbc.InterfaceError
    self.assertRaises(pyodbc.InterfaceError, connect_to_database, '')

我希望当传递给函数的数据库路径无效时,应该引发错误(在这种情况下为 InterfaceError)并且测试应该通过。由于测试是结构化的,因此不会发生这种情况。

标签: pythonpython-3.xunit-testingmockingpyodbc

解决方案


推荐阅读