当从 MySQLdb python 库中模拟 callproc 方法时,是否可以模拟存在某些 MySQL 过程
Is it possible to emulate that some MySQL procedure exists when mocking callproc method from MySQLdb python library
我有以下需要测试烧瓶路线的单元测试。
@unittest.mock.patch('flask_login.utils._get_user')
@unittest.mock.patch('flask_sqlalchemy.SQLAlchemy')
def test_attendances_management(self, SQLAlchemy, current_user):
user = MagicMock()
sqlalchemy = SQLAlchemy()
sqlalchemy.engine.return_value = MagicMock()
sqlalchemy.engine.raw_connection.return_value = MagicMock()
sqlalchemy.engine.raw_connection.cursor.return_value = MagicMock()
sqlalchemy.engine.raw_connection.cursor.callproc("get_project_members", [3, 9, 2020]).return_value = ((1, 3, 4),)
current_user.return_value = user
current_user.return_value.role.name = 'Administrator'
current_user.return_value.id = 1
response = self.client.get('attendances/management/3/2020/11')
self.assertEqual(response.status_code, 200)
一切正常(模拟数据库引擎、raw_connection 和游标),但我遇到一个问题,即 get_project_members 不存在。我需要模拟 flask-sqlalchemy
或 MySQLdb
库的哪一部分以伪造某些过程实际存在,因为我使用 flask-testing
创建例如一些 table `ExampleTable.table.create(db.session.bind),我不知道如何创建存储过程或如何使用 mock 来模拟该过程。
异常日志:
File "C\:my_app\app\attendances\views.py", line 169, in management
cursor.callproc("get_project_members", [project_id, month, year])
File "c:\my_app\flaskvenv\lib\site-packages\MySQLdb\cursors.py", line 365, in callproc
self._query(q)
File "c:\my_app\flaskvenv\lib\site-packages\MySQLdb\cursors.py", line 411, in _query
rowcount = self._do_query(q)
File "c:\my_app\flaskvenv\lib\site-packages\MySQLdb\cursors.py", line 374, in _do_query
db.query(q)
File "c:\my_app\flaskvenv\lib\site-packages\MySQLdb\connections.py", line 277, in query
_mysql.connection.query(self, query)
_mysql_exceptions.OperationalError: (1305, 'PROCEDURE my_app_test_db.get_project_members does not exist')
我刚刚使用 cursor.execute
方法解决了这个问题,该方法使用原始查询创建 MySQL 过程。另外,我已经有 db 作为 SQLAlchemy 的实例,所以我不需要模拟已经定义的连接。
@unittest.mock.patch('flask_login.utils._get_user')
def test_attendances_management(self, current_user):
user = MagicMock()
q = "CREATE PROCEDURE `get_project_members` (IN `project_id` INT, IN `month` INT, IN `year` INT) BEGIN END"
connection = db.engine.raw_connection()
cursor = connection.cursor()
cursor.execute(q)
current_user.return_value = user
current_user.return_value.role.name = 'Administrator'
current_user.return_value.id = 1
response = self.client.get('attendances/management/3/2020/11')
self.assertEqual(response.status_code, 200)
相似答案:
Creating Stored Procedures with SQLAlchemy
我有以下需要测试烧瓶路线的单元测试。
@unittest.mock.patch('flask_login.utils._get_user')
@unittest.mock.patch('flask_sqlalchemy.SQLAlchemy')
def test_attendances_management(self, SQLAlchemy, current_user):
user = MagicMock()
sqlalchemy = SQLAlchemy()
sqlalchemy.engine.return_value = MagicMock()
sqlalchemy.engine.raw_connection.return_value = MagicMock()
sqlalchemy.engine.raw_connection.cursor.return_value = MagicMock()
sqlalchemy.engine.raw_connection.cursor.callproc("get_project_members", [3, 9, 2020]).return_value = ((1, 3, 4),)
current_user.return_value = user
current_user.return_value.role.name = 'Administrator'
current_user.return_value.id = 1
response = self.client.get('attendances/management/3/2020/11')
self.assertEqual(response.status_code, 200)
一切正常(模拟数据库引擎、raw_connection 和游标),但我遇到一个问题,即 get_project_members 不存在。我需要模拟 flask-sqlalchemy
或 MySQLdb
库的哪一部分以伪造某些过程实际存在,因为我使用 flask-testing
创建例如一些 table `ExampleTable.table.create(db.session.bind),我不知道如何创建存储过程或如何使用 mock 来模拟该过程。
异常日志:
File "C\:my_app\app\attendances\views.py", line 169, in management
cursor.callproc("get_project_members", [project_id, month, year])
File "c:\my_app\flaskvenv\lib\site-packages\MySQLdb\cursors.py", line 365, in callproc
self._query(q)
File "c:\my_app\flaskvenv\lib\site-packages\MySQLdb\cursors.py", line 411, in _query
rowcount = self._do_query(q)
File "c:\my_app\flaskvenv\lib\site-packages\MySQLdb\cursors.py", line 374, in _do_query
db.query(q)
File "c:\my_app\flaskvenv\lib\site-packages\MySQLdb\connections.py", line 277, in query
_mysql.connection.query(self, query)
_mysql_exceptions.OperationalError: (1305, 'PROCEDURE my_app_test_db.get_project_members does not exist')
我刚刚使用 cursor.execute
方法解决了这个问题,该方法使用原始查询创建 MySQL 过程。另外,我已经有 db 作为 SQLAlchemy 的实例,所以我不需要模拟已经定义的连接。
@unittest.mock.patch('flask_login.utils._get_user')
def test_attendances_management(self, current_user):
user = MagicMock()
q = "CREATE PROCEDURE `get_project_members` (IN `project_id` INT, IN `month` INT, IN `year` INT) BEGIN END"
connection = db.engine.raw_connection()
cursor = connection.cursor()
cursor.execute(q)
current_user.return_value = user
current_user.return_value.role.name = 'Administrator'
current_user.return_value.id = 1
response = self.client.get('attendances/management/3/2020/11')
self.assertEqual(response.status_code, 200)
相似答案: Creating Stored Procedures with SQLAlchemy