首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模拟模拟类的方法

如何模拟模拟类的方法
EN

Stack Overflow用户
提问于 2022-02-13 12:04:01
回答 1查看 371关注 0票数 2

把替罪羊改成了更普通的。我想问题不在于这个类别的特殊性。

我想模拟google.cloud.pubsub_v1.SubscriberClient,我想在调用客户端的拉函数时设置一个假的返回值。

prod代码:来自google.cloud导入pubsub_v1

代码语言:javascript
复制
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代码中,我想设置调用拉方法的返回值。我正在测试代码中创建一个拉-响应对象。

测试代码:

代码语言:javascript
复制
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?

代码语言:javascript
复制
mock_subscriber.pull.return_value = pull_response
mock_subscriber.return_value.pull.return_value = pull_response

似乎都不起作用。拉方法的返回值保持为magicMock。

在调试(悬停在响应上)时,它是这样的:

EN

回答 1

Stack Overflow用户

发布于 2022-04-28 11:31:25

我也面临着同样的问题。但是可以从MagicMock内部的细节中得到一些信息。

尝试设置返回值(基于屏幕截图)

代码语言:javascript
复制
mock_subscriber.__enter__().pull.return_value = pull_response
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71100440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档