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