Python模拟psycopg2连接和游标
我无法模拟psycopg2数据库连接和游标,因为我已经对其进行了重构,以便为游标使用上下文管理器。我知道,使用上下文管理器,可以调用其他神奇的方法来设置和清理资源(Python模拟psycopg2连接和游标,python,unit-testing,mocking,pytest,contextmanager,Python,Unit Testing,Mocking,Pytest,Contextmanager,我无法模拟psycopg2数据库连接和游标,因为我已经对其进行了重构,以便为游标使用上下文管理器。我知道,使用上下文管理器,可以调用其他神奇的方法来设置和清理资源(\uuuuuuuuuuuuuuuuuuuuuuuuuuu,\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 代码如下: import os import psycopg2 import psycopg2.extras DB_HOST = os.get
\uuuuuuuuuuuuuuuuuuuuuuuuuuu
,\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
代码如下:
import os
import psycopg2
import psycopg2.extras
DB_HOST = os.getenv('DB_HOST')
DB_PORT = os.getenv('DB_PORT')
DB_NAME = os.getenv('DB_NAME')
DB_USER = os.getenv('DB_USER')
DB_PASSWORD = os.getenv('DB_PASSWORD')
CONN = psycopg2.connect(f'dbname={DB_NAME} user={DB_USER} host={DB_HOST} port={DB_PORT} password={DB_PASSWORD}')
def my_func():
message = None
print(CONN) # Added to debug - this never prints out a magic mock reference
select_sql = 'SELECT * FROM app.users WHERE name = %s LIMIT 1;'
with CONN.cursor(cursor_factory = psycopg2.extras.DictCursor) as cursor:
print(cursor) # Debug - no magic mock reference
cursor.execute(select_sql, ("Bob"))
row = cursor.fetchone()
if row is not None:
message = "name found"
else:
message = "name not found"
return message
下面是测试代码和我模拟连接和游标的尝试
import pytest
from src import my_class
from unittest import mock
class TestFunction:
@mock.patch('psycopg2.connect')
def test_my_func(self, mock_connect):
mock_cursor = mock.MagicMock()
mock_cursor.__enter__.return_value.fetchone.return_value = {
"id": 1,
"name": "Bob",
"age": 25
}
mock_connect.return_value.cursor.return_value = mock_cursor
result = my_class.my_func()
assert result == "found"
如果在全局连接上调用CONN
,我不确定如何模拟连接或光标。当前运行的pytest显示测试失败,print语句显示底层对象不是magic mock。如何使用上下文管理器模拟全局数据库连接和数据库游标?感谢您的帮助 我找到了解决办法!我有一种感觉,我的问题在于全局变量CONN
,我研究了如何模拟python全局变量并进行了尝试。我的书面陈述最终表明,这些例子确实是魔术模拟
在我的测试中,我只调用被测试的方法,而不是用全局变量触发代码,所以只需将其设置为您想要的。一旦你有了答案,听起来就直截了当了,对吗
mock_cursor = mock.MagicMock()
mock_cursor.fetchone.return_value = {
"id": 1,
"name": "Bob",
"age": 25
}
mock_connect.cursor.return_value.__enter__.return_value = mock_cursor
my_class.CONN = mock_connect
没有什么比回答你自己的问题更好的了 我找到了解决办法!我有一种感觉,我的问题在于全局变量CONN
,我研究了如何模拟python全局变量并进行了尝试。我的书面陈述最终表明,这些例子确实是魔术模拟
在我的测试中,我只调用被测试的方法,而不是用全局变量触发代码,所以只需将其设置为您想要的。一旦你有了答案,听起来就直截了当了,对吗
mock_cursor = mock.MagicMock()
mock_cursor.fetchone.return_value = {
"id": 1,
"name": "Bob",
"age": 25
}
mock_connect.cursor.return_value.__enter__.return_value = mock_cursor
my_class.CONN = mock_connect
没有什么比回答你自己的问题更好的了