我正在尝试对我的功能之一进行单元测试以确保数据库连接有效,如果无效,请提出适当的异常。在给定给定的情况下,我无法测试适当的异常数据库连接无效无效
我已经成功地模拟了数据库连接,并在连接有效时获得了想要的结果。但是,尽管测试成功,但绝对不能按预期进行。当我模拟具有特定错误的数据库连接并断言引发了另一个错误时,即使它们是不同的错误,测试仍然可以通过。有关更多详细信息,请参见代码。
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)
我希望,如果将模拟数据库连接设置为一种错误类型,并且断言另一种错误,则测试应该失败。事实并非如此。
答案 0 :(得分:2)
pyodbc.ProgrammingError
是pyodbc.DatabaseError
的子类,而pyodbc.Error
是self.assertRaises(pyodbc.Error, get_database)
的子类,因此:
pyodbc.Error
只要引发pyodbc.DatabaseError
的子类的任何异常实例(包括pyodbc.Error
),它就会通过。
您应具体说明要捕获的A
的哪个子类。