簡體   English   中英

使用 unittest.mock,如何模擬成員字段的方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM