python单元测试中的模拟嵌套函数



我试图使用mock和patch对some.py中的some_fun((进行单元测试,但它没有按预期工作。我无法正确地修补db_helper.fetchallmetrics函数中的cursor.fetchall((。下面的函数testrongome((抛出类似的错误

"断言错误:((35235,4(,(342,3((!=<Mock id='1926131587392'>quot;

db_helper.py

import settings
import pyodbc

class Connection:
def __init__(self):
self.SERVER= settings.SERVER
self.DATABASE = settings.DATABASE
self.USER = settings.USER
self.PASSWORD = settings.PASSWORD

def connect_db(self):
try:
conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+self.SERVER+';DATABASE='+self.DATABASE+';UID='+self.USER+';PWD='+self.PASSWORD)
self.LOGGER.info("Connected to PSP Database")
return conn
except Exception as e:
self.LOGGER.error("Unable to connect Database. {0}".format(e))
def fetchallmetrics(self,connection, query):
cursor = connection.cursor()
cursor.execute(query)
metrics=cursor.fetchall()
return metrics

import settings
import db_helper  as dh
import constant
class SomeMetrics:
def __init__(self):
# Set the date of which metric is collected
self.metric_collected_date = settings.METRICS_COLLECTED_DATE
self.LOGGER = settings.LOGGER
def some_fun(self, connection):
try:
count = dh.Connection().fetchallmetrics(connection,"SELECT * FROM TABLE")
return count
except Exception as e:
self.LOGGER.error("{0} at some_fun()".format(e))

testrongome.py

import unittest
from unittest import mock
from mock import patch, Mock
from Some import SomeMetrics
class TestSomeMetrics(unittest.TestCase):

def setUp(self):
self.km = SomeMetrics()

@mock.patch("db_helper.Connection.connect_db", autospec=True)
@mock.patch("db_helper.Connection.fetchallmetrics", autospec=True)
def test_some_fun(self, mock_some_connection, mock_fetchallmetrics):
posting_count = ((35235, 4), (342, 3))
mock_data_interface = Mock()
mock_fetchallmetrics_interface = Mock()
mock_fetchallmetrics.return_value = mock_fetchallmetrics_interface
mock_fetchallmetrics_interface.cursor.return_value.fetchall.return_value = posting_count
mock_some_connection.return_value = mock_data_interface
self.assertEqual(posting_count,self.km.some_fun(mock_some_connection))

在我看来,如果您创建一个单独的类MockConnection:,它会更可读

class MockConnection:
def __init__(self,metrics):
self.metrics = metrics
def fetchallmetrics(self,connection, query):
return self.metrics
# ...
def test_some_fun(self):
posting_count = ((35235, 4), (342, 3))
mock_connection = MockConnection(posting_count)
self.assertEqual(posting_count, self.km.some_fun(mock_connection))

最新更新