[英]With unittest.mock, how do you mock a method of a member field?
我正在使用 Python 3.8。 我有一個帶有成員字段的類...
class AbcServiceBus:
def __init__(self, ...):
...
self._service_bus = AzureServiceBus()
def send_insert_notification(self, record_id):
message_json = {'ids': [record_id]}
self._service_bus.send_topic_message(
namespace_name=self._namespace,
topic_name=self._topic_name,
message_json=message_json
)
return True
我想模擬成員字段的“send_topic_message”方法。 我嘗試了以下
from unittest import mock
...
sb = AbcServiceBus(device)
with mock.patch('common.azure_service_bus.AzureServiceBus.send_topic_message') as send_topic_message_mock:
sb.send_insert_notification(record_id)
send_topic_message_mock.assert_called_with(
sb._namespace,
sb._topic_name,
{'ids': [record_id]}
)
但這會繼續調用類的真實方法,而不是我設置的模擬。 模擬成員字段的方法的正確方法是什么?
我將模擬AzureServiceBus
類。 在AzureServiceBus
類之后創建AbcServiceBus
的實例,以便我們可以使用AzureServiceBus
版本
azure_service_bus.py
:
from azure.servicebus.control_client import ServiceBusService as AzureServiceBus
class AbcServiceBus:
def __init__(self):
self._namespace = '_namespace'
self._topic_name = '_topic_name'
self._service_bus = AzureServiceBus()
def send_insert_notification(self, record_id):
message_json = {'ids': [record_id]}
self._service_bus.send_topic_message(
namespace_name=self._namespace,
topic_name=self._topic_name,
message_json=message_json
)
return True
test_azure_service_bus.py
:
import unittest
from unittest import mock
from azure_service_bus import AbcServiceBus
class TestAbcServiceBus(unittest.TestCase):
def test_send_insert_notification(self):
record_id = '1'
with mock.patch('azure_service_bus.AzureServiceBus') as mock_AzureServiceBus:
mock_AzureServiceBus_instance = mock_AzureServiceBus.return_value
sb = AbcServiceBus()
actual = sb.send_insert_notification(record_id)
self.assertTrue(actual)
mock_AzureServiceBus.assert_called_once()
mock_AzureServiceBus_instance.send_topic_message.assert_called_with(
namespace_name='_namespace',
topic_name='_topic_name',
message_json={'ids': ['1']}
)
if __name__ == '__main__':
unittest.main()
單元測試結果:
.
----------------------------------------------------------------------
Ran 1 test in 0.002s
OK
Name Stmts Miss Cover Missing
------------------------------------------------------------------------------------
src/stackoverflow/64447772/azure_service_bus.py 10 0 100%
src/stackoverflow/64447772/test_azure_service_bus.py 15 0 100%
------------------------------------------------------------------------------------
TOTAL 25 0 100%
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.