把替罪羊改成了更普通的。我想问题不在于这个类别的特殊性。
我想模拟google.cloud.pubsub_v1.SubscriberClient,我想在调用客户端的拉函数时设置一个假的返回值。
prod代码:来自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
}
)从上面的prod代码中,我想设置调用拉方法的返回值。我正在测试代码中创建一个拉-响应对象。
测试代码:
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。但是,我不能为调用拉方法设置return_value。但不会有一个拉回值。我得到的只是另一个创建的magicMock。
我不明白它为什么不起作用。正如我所读到的大多数内容一样,我们通常不得不在模拟中调用'return_value‘,附加要设置的字段或函数的名称,追加'return_value’,并设置一个值viea MagicMock。格式应为: mockFirst.return_value.second.return_value.third.return_value = Mock(return_value = the_value_to_return)
希望你能解释我做错了什么。谢谢。
编辑:还尝试了以下在其他帖子中找到答案的方法:Mocking Method Calls In Python Mock a method of a mocked object in Python?
mock_subscriber.pull.return_value = pull_response
mock_subscriber.return_value.pull.return_value = pull_response似乎都不起作用。拉方法的返回值保持为magicMock。
在调试(悬停在响应上)时,它是这样的:

发布于 2022-04-28 11:31:25
我也面临着同样的问题。但是可以从MagicMock内部的细节中得到一些信息。
尝试设置返回值(基于屏幕截图)
mock_subscriber.__enter__().pull.return_value = pull_responsehttps://stackoverflow.com/questions/71100440
复制相似问题