【问题标题】:Python Mocking the postgres databasePython 模拟 postgres 数据库
【发布时间】:2019-07-29 07:42:28
【问题描述】:

MagicMock name='con.cursor.fetchall' id='a121213312' 我想在调用读取函数时有价值

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 name='con.cursor.fetchall' id='a121213312' != (9, 'jibreel')

【问题讨论】:

  • 变量结果的打印输出是什么?

标签: python testing mocking


【解决方案1】:

这里发生了很多事情:

  • 您正在尝试模拟模块内部的变量,而该变量并未真正导出。我不确定你是否真的能做到这一点,但你不需要。您的 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。了解有关模拟和测试的新知识。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多