Как выполнить юнит тестирование ошибок в Python при использовании Try and Except - PullRequest
2 голосов
/ 10 апреля 2019

Я пытаюсь выполнить модульное тестирование одной из своих функций, чтобы убедиться, что соединение с базой данных является действительным, и, если это не так, вызвать правильное исключение. У меня возникают трудности с возможностью проверить, было ли вызвано правильное исключение, учитываячто соединение с базой данных не допустимо

Я успешно смоделировал соединение с базой данных и получил желаемый результат, когда соединение допустимо.Однако, несмотря на то, что тест был успешным, он определенно не работает, как предполагалось.Когда я проверяю соединение с базой данных с конкретной ошибкой и утверждаю, что возникла другая ошибка, тест все равно проходит, даже если это разные ошибки.См. Код для получения более подробной информации.

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 Ответ

2 голосов
/ 10 апреля 2019

pyodbc.ProgrammingError - это подкласс pyodbc.DatabaseError, который является подклассом pyodbc.Error, поэтому с вашим:

self.assertRaises(pyodbc.Error, get_database)

будет проходить, пока возбуждается любой экземпляр исключения из подкласса pyodbc.Error, включая pyodbc.DatabaseError.

Вы должны указать, какой подкласс pyodbc.Error вы хотите поймать.

...