Как смоделировать курсор cx_Oracle в Python - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть две функции ниже в классе, и мне нужно смоделировать соединение с базой данных и результаты курсора.cx_Oracle.connect успешно пропатчен, работает как положено.Но курсор, callfunc, fetch_all не становится ложным.Есть идеи, какой будет правильный синтаксис?

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

Мой код издевательства

with mock.patch('dbconnect.cx_Oracle.connect') as mockOracle:

   result_set = {}
   mockOracle.cursor.callfunc.fetch_all = result_set

1 Ответ

0 голосов
/ 22 сентября 2018

Вам на самом деле не нужно «макетировать» соединение и курсор вообще!Вы можете просто создать подкласс для соединения и навести курсор на себя, например так:

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

Я не уверен, что это было то, что вы намеревались или знали ли вы об этой возможности.Благодаря этому вы можете добавлять новые функции и изменять или расширять существующие.

...