Python 模拟 postgres 数据库

3

魔法模拟器名称为“con.cursor.fetchall”,ID为“a121213312”。

当我调用read函数时,我希望能够获得值。

db.py

try:
    con = psycopg2.connect(
                    host="yhvh",
                    database="python_db",
                    user="postgres",
                    password="ichoose",
                    )
except:
    print("Unable to connect database")

# Open a cursor to perform database operation
cur = con.cursor()

def read(con):
    """
    Read data in Database
    """
    print("Read")
    cur = con.cursor()

    # execute the query
    data ="SELECT id, name FROM employees"
    cur.execute(
        data
    )
    # fetchall - returns all entries
    rows = cur.fetchall()

    for r in rows:
        print(f"id {r[0]} name {r[1]}")

    return rows

test_db.py

class TestDb(unittest.TestCase):
    """
    Study
        - Mock and Unittes
    """
    def test_read(self):
        expected = (9, 'jibreel')

        with patch("db.con") as mock_connect:
            mock_con = mock_connect.return_value
            mock_cur = mock_con.cursor.return_value
            mock_cur.fetchall.return_value = expected

            result = db.read(mock_connect)
            print(result)
            self.assertEqual(result, expected)



我在测试时遇到了错误。
AssertionError: MagicMock的名称为'con.cursor.fetchall',ID为'a121213312',但实际结果是(9, 'jibreel')。

变量result的打印输出是什么? - Wobli
1个回答

3
这里涉及到几个问题:
  • 你试图模拟一个在你的模块中不会真正导出的变量。我不确定你是否能真正实现这一点,但你不需要这样做。你的read函数接受一个连接作为参数,你可以使用该模拟。

  • 你将有一些行的列表,这基本上是一个列表的列表,但在你的返回值中只有一行,这将导致你的for循环失败(因为在第一次循环时,r将是9r[0]将失败)

  • 顺便说一下:请不要用db.py这样的名字来调用你的模块,因为有可能会有一些预先制作的模块与该名称相同,这可能会导致一些导入问题。

所以,如果我正确理解了你的意思,你可以尝试以下方法:

import unittest
from unittest.mock import MagicMock
import db # Consider renaming this


class TestDb(unittest.TestCase):
    def test_read(self):
        expected = [(9, 'jibreel')]

        mock_connect = MagicMock()
        mock_cursor = MagicMock()
        mock_cursor.fetchall.return_value = expected
        mock_connect.cursor.return_value = mock_cursor

        result = d.read(mock_connect)
        self.assertEqual(result, expected)

这可能可以简化一些,但这应该可以工作。


谢谢,@ChatterOne。了解有关模拟和测试的新知识。 - jmrcas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接