在Python中测试函数时如何引发错误

时间:2019-04-15 18:41:47

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

我正在尝试做一个非常简单的测试,其中我的函数接受一个参数,即数据库的路径,并尝试使用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),并且测试应该通过。由于测试是结构化的,因此不会发生这种情况。

0 个答案:

没有答案