Я борюсь с насмешкой над вызовом конструктора в объектном методе, который вызывается «процедурной» функцией.
Для лучшего понимания вот мой код в виде короткой версии:
Файл ./src/b/lambda_function.py:
from src.b.oee_retriever import OeeRetriever
oee_retriever = OeeRetriever()
def handler(event, context):
return oee_retriever.call_repo()
Файл ./src/b/oee_retriever.py:
from src.b.oee_repo import OeeRepo
class OeeRetriever():
oee_repo = None
def __init__(self):
self.oee_repo = OeeRepo()
print('Type: ' + str(type(self.oee_repo)))
def call_repo(self):
print('calling repo')
return self.oee_repo.do()
Теперь я просто хочу проверить функцию lambda_function.handler()
, и я хочу макет вызов конструктора OeeRepo()
в oee_retriever.__init__()
Я попытался:
from unittest import TestCase
from unittest.mock import Mock, patch
from src.b.lambda_function import handler
class OeeLambdaFunctionTest(TestCase):
@patch('src.b.oee_repo.OeeRepo')
def test_bar(self, oee_repo):
my_mock = Mock()
my_mock.do.return_value = 'nope'
oee_repo.return_value = my_mock
result = handler(None, None)
self.assertEqual(result, 'nope')
Пересмотренырезультат должен быть nope, но вместо этого вызывается реальная функция oee_repo.do()
.Я также попытался использовать @patch('src.b.oee_retriever.OeeRepo')
, но в этом случае также был вызван oee_repo.do()
.
Как я могу высмеять вызов конструктора OeeRepo()
?