Я пытаюсь написать модульный тест для одного из моих модулей, используя 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.