Выборочно высмеивать модуль в Python 3,7 - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь написать модульный тест для одного из моих модулей, используя py mysql следующим образом:

def execute(self, query):

    try:
        conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='', 
                                db='mysql')

        cur = conn.cursor()

        cur.execute(query)

    except pymysql.Error as e:
        raise
    except Exception as e:
        raise

При написании модульного теста для вышеупомянутой функции я издеваюсь над py sql следующим образом @patch(my_package.my_module.pymysql). В результате pymysql.error также становится насмешливым. Таким образом, при тестировании сценария сбоя следующим образом:

@patch('my_package.my_module.pymysql')
def test_execute_with_failure(self, mock_pymysql):
    ...
    self.my_obj.cur.execute.side_effect = pymysql.Error
    with self.assertRaises(pymysql.Error) as context:
        _ = self.my_obj.execute(query="SELECT FOO FROM BAR")

Я получаю следующую ошибку:

TypeError: catching classes that do not inherit from BaseException is not allowed

В связи с этим я прошел через это: Не могу поймать ложное исключение, потому что оно не наследует BaseException . Но я не понимаю, как заставить это работать для pymysql.

РЕДАКТИРОВАТЬ 1: Как и предполагалось, я пытался смоделировать только pymysql.connect следующим образом:

@patch('my_package.my_module.pymysql.connect')
def test_execute_with_failure(self, mock_pymysql_conn):
     cursor = MagicMock()

     mock_pymysql_conn.return_value.cursor = cursor
     self.my_obj.cur = cursor

     self.my_obj.cur.execute.side_effect = pymysql.Error

     with self.assertRaises(pymysql.Error) as context:
        _ = self.my_obj.execute(query="SELECT FOO FROM BAR")

Но, Я получаю здесь, как показано ниже:

E           AttributeError: <module 'pymysql' from '/my_project/venv/lib/python3.7/site-packages/pymysql/__init__.py'> does not have the attribute ''

РЕДАКТИРОВАТЬ 2: Я пробовал также с подходом ниже:

@patch('my_package.my_module.pymysql')
def test_execute_with_failure(self, mock_pymysql):
    conn = Mock()
    mock_pymysql.connect.return_value = conn
    cursor = MagicMock()

    conn.return_value.cursor = cursor
    self.my_obj.cur = cursor

    mock_pymysql.Error = type('PymysqlError', (Exception,), {})
    self.my_obj.cur.execute.side_effect = mock_pymysql.Error
    with self.assertRaises(mock_pymysql.Error) as context:
        _ = self.my_obj.execute(query="SELECT * FROM TEST")

Все еще та же ошибка, что и Редактировать 1.

...