首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当从MySQL库中模拟callproc方法时,是否可以模拟某些MySQLdb过程?

当从MySQL库中模拟callproc方法时,是否可以模拟某些MySQLdb过程?
EN

Stack Overflow用户
提问于 2020-10-19 14:17:07
回答 1查看 117关注 0票数 0

我有下面的单元测试,需要测试烧瓶路线。

代码语言:javascript
复制
@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)

一切都很顺利(模拟db引擎、raw_connection和游标),但我有一个get_project_members不存在的问题。我需要模拟flask-sqlalchemyMySQLdb库的哪一部分才能假装某个过程确实存在,因为我使用flask-testing创建了一些表,例如,我不知道如何创建存储过程,也不知道如何使用MySQLdb模拟该过程。

异常日志:

代码语言:javascript
复制
    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')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-19 15:02:59

我刚刚通过使用cursor.execute方法来解决这个问题,该方法使用原始查询来创建MySQL过程。此外,我已经将db作为SQLAlchemy的实例,因此不需要模拟已经定义的连接。

代码语言:javascript
复制
    @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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64429264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档