簡體   English   中英

來自基類的Python模擬psycopg2

[英]Python mock psycopg2 from base class

嗨,我在模仿繼承類中的游標對象時遇到了麻煩。 這是我的代碼的一部分:

# classa.py
class ClassA(ClassB):
    def __init__(self, params):
        ClassB.__init__(params)
        # other params

    def get_current_attr(self):
        sql = "SELECT max(attr) FROM {};".format(self.table_name)
        self.rs_cursor.execute(sql)
        current_attr = self.rs_cursor.fetchone()[0]
        return current_attr

# classb.py
import psycopg2

class ClassB:
    def __init__(self, params):
        self.redshift_conn = self.open_redshift_connection()
        self.redshift_conn.set_isolation_level(
            psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
        self.rs_cursor = self.redshift_conn.cursor()

現在,我想在ClassA的get_current_attr()函數中模擬psycopg2游標。 我試圖這樣做:

@mock.patch("mypackage.classa.classb.psycopg2.connect")
def test_get_current_attr(self, mock_connect):
    mock_con = mock_connect.return_value
    mock_cur = mock_con.cursor.return_value
    mock_cur.fetch_one.return_value = 1
    result = self.gap_load_instance.get_current_batch_id()
    mock_cur.execute.assert_called_with(
        "SELECT max(attr) FROM tablename"
    )

我得到:

引發AssertionError('預期的呼叫:%s \\ n未呼叫'%(預期的))

誰能幫我這個?

模擬整個psycopg2最簡單。 我為您缺少的功能添加了存根,但是類似這樣的方法應該起作用:

# classa.py
class ClassA(ClassB):
    def __init__(self, params):
        super().__init__(params)
        # other params

    def get_current_attr(self):
        sql = "SELECT max(attr) FROM {};".format(self.table_name)
        self.rs_cursor.execute(sql)
        current_attr = self.rs_cursor.fetchone()[0]
        return current_attr

# classb.py
import psycopg2

class ClassB:
    def __init__(self, params):
        self.redshift_conn = self.open_redshift_connection()
        self.redshift_conn.set_isolation_level(
            psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
        self.rs_cursor = self.redshift_conn.cursor()
        self.table_name = "atablename"

    def open_redshift_connection(self):
        return psycopg2.connect()

然后

from unittest import TestCase, mock
from classa import ClassA

class Tester(TestCase):
    @mock.patch("classb.psycopg2")
    def test_get_current_attr(self, mock_psycopg2):
        mock_cur = mock_psycopg2.connect().cursor()
        mock_cur.fetch_one.return_value = 1

        a = ClassA({})
        result = a.get_current_attr()

        mock_cur.execute.assert_called_with(
            "SELECT max(attr) FROM {};".format(a.table_name)
        )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM