首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python MagicMock.return_value返回MagicMock而不是return_value

Python MagicMock.return_value返回MagicMock而不是return_value
EN

Stack Overflow用户
提问于 2020-03-27 14:59:26
回答 1查看 3.3K关注 0票数 1

我有一个函数来验证给定的输入字符串是否是正确的GCP区域:

代码语言:javascript
复制
def validate_zone(compute, project_id, zone):
    try:
        zone_response = compute.zones().get(project=project_id, zone=zone).execute()
        print(zone_response)
        print(zone_response.return_value)
        if ['status'] in zone_response:
            zone_details = {
                'status': zone_response['status'],
                'region': zone_response['region'],
                'name': zone_response['name']
            }
            return zone_details
        else:
            return "Zone {} not found for project {}".format(zone, project_id)
    except HttpError as error:
        print("Error calling zone {}: \n {}".format(zone, error))

我试图编写一个测试来验证这一点,但是我无法正确地模拟计算方法的输出。

代码语言:javascript
复制
@patch('googleapiclient.discovery')
def test_validate_zone(self, mock_response):
    compute = mock_response.build(serviceName='compute', version='v1')
    compute.zones().get(project_id=self.project_id, zone=self.zone).execute().return_value = {
        'status': 'status',
        'region': 'region',
        'name': 'name'
    }
    zone_response = inventory.validate_zone(compute, self.project_id, self.zone)
    print(zone_response)

这将导致zone_response输出是一个MagicMock对象,它的return_value与测试中开发的return_value是正确的。

代码语言:javascript
复制
zone_response = MagicMock name='discovery.build().zones().get().execute()' id='139870134525456'
代码语言:javascript
复制
zone_response.return_value = {'status': 'status', 'region': 'region', 'name': 'name'}

对我做错了什么有什么想法吗?我已经尝试了很长一段时间来编写测试,所以我的方法可能已经过时了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-30 11:32:10

结果是测试中execute方法上的()问题。因此,正确的测试应该是:

代码语言:javascript
复制
@patch('inventory.discovery.build', serviceName='compute', version='v1')
    def test_validate_zone(self, compute):
        print(compute)
        compute.zones().get(project_id=self.project_id, zone=self.zone).execute.return_value = {
            'status': 'status',
            'region': 'region',
            'name': 'name'
        }
        zone_response = inventory.validate_zone(compute, self.project_id, self.zone)
        print(zone_response)

来源可在以下网站找到:https://realpython.com/python-mock-library/#managing-a-mocks-return-value

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60888565

复制
相关文章

相似问题

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