Я пытаюсь использовать unittests.mock
для имитации вызова метода void объекта.
Мой пакет похож на ниже
common
baseupgradehandler.py
baseupgradehandler.py
class BaseUpgradeHandler(object):
def __init__(self, upgrade_config, upgrade_state, system_config, pre_step, main_step, post_step):
...
# Method call to be supressed
def start(self, service_manifest, upgrade_bundle):
# type: (service_version_pb2.ServiceManifest, str) -> ()
...
В своем тестовом коде я пытаюсь смоделировать вызов start()
, как показано ниже, как описано в документации .
from workflow.upgradeworkflow import UpgradeWorkflow
from common.serviceregistry import ServiceRegistry
# The above imports are at the start of the test file
...
with patch('common.baseupgradehandler.BaseUpgradeHandler') as handler_mock: # type: Mock
handler_mock.return_value.start.return_value = ''
wf = UpgradeWorkflow(ServiceRegistry(self.service_bundle, config, sys_config, state),
config,
state,
sys_config)
BaseUpgradeHandler
объект возвращается get_upgrade_handler()
методом ServiceRegistry
.Когда я выполняю приведенный выше код в тесте, я вижу, что BaseUpgradeHandler.start()
все еще вызывается.
Может кто-нибудь дать мне знать, как я могу посмеяться над вызовом start()
, чтобы метод не вызывался?
РЕДАКТИРОВАТЬ
Если я изменю свой код исправления, как показано ниже, он будет работать, как ожидалось, и BaseUpgradeHandler
будет издеваться, а start
не вызываться.
with patch('common.baseupgradehandler.BaseUpgradeHandler') as handler_mock: # type: Mock
handler_mock.return_value.start.return_value = ''
with patch('common.serviceregistry.ServiceRegistry') as serviceregistry_mock: # type: Mock
serviceregistry_mock.return_value.get_upgrade_handler.return_value = handler_mock
wf = UpgradeWorkflow(ServiceRegistry(self.service_bundle, config, sys_config, state), config, state, sys_config)
wf.start()
Может кто-нибудь объяснить мне, почему я должен также исправлять ServiceRegistry
?