微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从MySQLdb python库模拟callproc方法时是否可以模拟某些MySQL过程存在

如何解决从MySQLdb python库模拟callproc方法时是否可以模拟某些MySQL过程存在

我有以下单元测试,需要测试烧瓶路径。

@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-sqlalchemyMysqLdb库的哪一部分,以便伪造某些过程实际上存在,因为我使用flask-testing来创建例如表ExampleTable。 table .create(db.session.bind),并且我不知道如何创建存储过程或如何使用模拟来模拟该过程。

异常日志:

    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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?