簡體   English   中英

如何模擬模擬 class 的方法

[英]How to mock method of a mocked class

將標題更改為更常見的標題。 我想問題不在於 class 具體。

我想模擬 google.cloud.pubsub_v1.SubscriberClient 我想在調用客戶端的 pull function 時設置一個假的返回值。

產品代碼:從 google.cloud 導入 pubsub_v1

def open_subscription() -> None:
    with pubsub_v1.SubscriberClient() as subscriber:
        logger.info(f'Listening for messages on {config.SUBSCRIPTION_NAME}', {'operation': {'first': True}})

        while True:
            # get messages
            response = subscriber.pull(
                request = {
                    'subscription': config.SUBSCRIPTION_NAME,
                    'max_messages': config.MAX_MESSAGES
                }
            )

從上面的產品代碼中,我想設置調用 pull 方法的返回值。 我正在測試代碼中創建拉式響應 object。

測試代碼:

import unittest
from unittest.mock import MagicMock, patch
from app.pubsub import pubsub_service
from google import pubsub_v1
import json
        
class TestPubSubService(unittest.TestCase):
    
    def create_test_message(self):
        message_string = '{"testKey": "testValue"}'
        message_json = json.dumps(message_string, indent=2)
        message_data = message_json.encode('utf-8')
        
        pubsub_message = pubsub_v1.PubsubMessage()
        pubsub_message.data = message_data

        received_message = pubsub_v1.ReceivedMessage()
        received_message.ack_id = "testId"
        received_message.message = pubsub_message

        return received_message
    
    def create_test_pull_response(self, received_message):
        pull_response = pubsub_v1.PullResponse()
        pull_response.received_messages = [received_message]
        return pull_response
    
    @patch('app.pubsub.pubsub_service.pubsub_v1.SubscriberClient')
    def test_open_subscription(self, mock_subscriber):

        test_message = self.create_test_message()
        pull_response = self.create_test_pull_response(test_message)
        mock_subscriber.return_value.pull.return_value = MagicMock(return_value = pull_response)

        pubsub_service.open_subscription()

至少 MagicMock 到位了(不使用補丁,真正的訂閱者到位了)。 所以基本上我會說我嘲笑了 subscriberClient。 但是我無法為調用 pull 方法設置 return_value。 但是不會有拉回值。 我得到的只是創建的另一個 magicMock。

我不明白為什么它不起作用。 正如我讀到的大多數東西一樣,我們通常必須在模擬上調用“return_value”,append 要設置的字段名稱或 function,append 那些“return_value”並通過 MagicMock 設置一個值。 格式應為:mockFirst.return_value.second.return_value.third.return_value = Mock(return_value = the_value_to_return)

希望你能解釋我做錯了什么。 謝謝。

編輯:還嘗試了以下那些答案在其他帖子中的方法: Mocking Python 中的方法調用模擬 Python 中模擬 object 的方法?

mock_subscriber.pull.return_value = pull_response
mock_subscriber.return_value.pull.return_value = pull_response

似乎沒有一個工作。 pull 方法的返回值仍然是一個 magicMock。

這就是它在調試時的樣子(懸停在響應上): 在此處輸入圖像描述

我遇到了同樣的問題。 但是可以從MagicMock里面的細節中了解到。

嘗試設置返回值(根據您的屏幕截圖)

mock_subscriber.__enter__().pull.return_value = pull_response

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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