如何在Python中模拟cx_Oracle游标

如何在Python中模拟cx_Oracle游标,python,mocking,patch,python-unittest,cx-oracle,Python,Mocking,Patch,Python Unittest,Cx Oracle,我在一个类中有以下两个函数,我需要模拟数据库连接和游标结果。cx_Oracle.connect已成功修补。它按预期工作。但是游标callfunc、fetch_all没有得到mock。知道正确的语法是什么吗 class dbconnect: def db_connect(self, connection_details): connection = cx_Oracle.connect(user_name,pwd,<connection_string>)

我在一个类中有以下两个函数,我需要模拟数据库连接和游标结果。cx_Oracle.connect已成功修补。它按预期工作。但是游标callfunc、fetch_all没有得到mock。知道正确的语法是什么吗

class dbconnect:

    def db_connect(self, connection_details):
        connection = cx_Oracle.connect(user_name,pwd,<connection_string>)
        return connection

    def execute_function(self, sqlFunction, args):
        cursor = self.connection.cursor()
        res=cursor.callfunc(sqlFunction, cursor.var(cx_Oracle.CURSOR), args)
        results = {'headers' : [x[0] for x in res.description],
            'data': res.fetchall()
        }
        cursor.close()
        return results

实际上,您根本不必“模拟”连接和光标!您可以自己对连接和游标进行子类化,如下所示:

class MyConnection(cx_Oracle.Connection):

    def cursor(self, scrollable=False):
        return MyCursor(self, scrollable)

class MyCursor(cx_Oracle.Cursor):

    def execute(self, sql, args):
        result = super(MyConnection, self).execute(sql, args)
        print("My mock execute...")
        return result

我不确定这是否是你的意图,或者你是否知道这种可能性。有了它,您可以添加新函数,也可以覆盖或扩展现有函数。

传递到
patch
的字符串应该是被测函数所在的路径。e、 g.
.patch('path.to.module.cx\u Oracle.connect')
是。它(路径)在我的代码中,并且成功模拟了cx_Oracle.connect。问题是如何模拟游标、callfunc和fetch_all。如果我想保持我的常规连接,而不是覆盖,并且仍然想模拟它,那该怎么办呢。就像我想为一些测试用例提出一个错误,对于一些测试用例,我想得到一个结果。如何使用此代码实现这一点?在这种情况下,您需要调用
MyCursor(connection)
来构建光标,而不是调用
connection.cursor()
class MyConnection(cx_Oracle.Connection):

    def cursor(self, scrollable=False):
        return MyCursor(self, scrollable)

class MyCursor(cx_Oracle.Cursor):

    def execute(self, sql, args):
        result = super(MyConnection, self).execute(sql, args)
        print("My mock execute...")
        return result