首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模拟googleapiclient.discovery.build

如何模拟googleapiclient.discovery.build
EN

Stack Overflow用户
提问于 2019-06-27 15:28:43
回答 1查看 1.9K关注 0票数 4

我试图模拟API调用的结果,以计算引擎来列出am。但不幸的是不能嘲笑一个精确的函数。

我尝试过使用补丁和模拟方法来模拟特定的调用,但仍未成功。

code.py文件如下所示

代码语言:javascript
复制
import googleapiclient.discovery
import logging

class Service:
    def __init__(self, project, event):
        self.project_id = project
        self.compute = googleapiclient.discovery.build('compute', 'v1',
                                                       cache_discovery=False)
        self.event = event
        self.zones = self._validate_event()

    def _validate_event(self):
        if "jsonPayload" not in self.event:
            zones = self.compute.zones().list(
                project=self.project_id).execute()['items']

        else:
            zones = self.compute.zones().get(project=self.project_id,
                                             zone=self.event["jsonPayload"]
                                             ["resource"]["zone"]).execute()

        logging.debug(f"Identified Zones are {zones}")
        return [zone["name"] for zone in zones]

我的测试文件如下所示

代码语言:javascript
复制
# in-built
from unittest import TestCase
from unittest.mock import patch

# custom
import code


class TestServiceModule(TestCase):
    def setUp(self):
        self.project_id = "sample-project-id"

    @patch('code.googleapiclient.discovery')
    def test__validate_event_with_empty_inputs(self, mock_discovery):
        mock_discovery.build.zones.list.execute.return_value = {"items": [
            {
                "name": "eu-west-1"
            }
        ]}

        obj = code.Service(event={}, project=self.project_id)

        print(obj.zones)

在上面的测试用例中,我期望在打印obj.zones时将"eu-west-1“作为值。

EN

回答 1

Stack Overflow用户

发布于 2020-10-13 11:32:08

您没有正确地模拟googleapiclient.discovery.build方法。以下是单元测试解决方案:

例如。

code.py

代码语言:javascript
复制
import googleapiclient.discovery
import logging


class Service:
    def __init__(self, project, event):
        self.project_id = project
        self.compute = googleapiclient.discovery.build('compute', 'v1', cache_discovery=False)
        self.event = event
        self.zones = self._validate_event()

    def _validate_event(self):
        if "jsonPayload" not in self.event:
            zones = self.compute.zones().list(project=self.project_id).execute()['items']
        else:
            zones = self.compute.zones().get(project=self.project_id,
                                             zone=self.event["jsonPayload"]["resource"]["zone"]).execute()

        logging.debug(f"Identified Zones are {zones}")
        return [zone["name"] for zone in zones]

test_code.py

代码语言:javascript
复制
from unittest import TestCase, main
from unittest.mock import patch
import code


class TestService(TestCase):
    def setUp(self):
        self.project_id = "sample-project-id"

    @patch('code.googleapiclient.discovery')
    def test__validate_event_with_empty_inputs(self, mock_discovery):
        # Arrange
        mock_discovery.build.return_value.zones.return_value.list.return_value.execute.return_value = {
            "items": [{"name": "eu-west-1"}]}

        # Act
        obj = code.Service(event={}, project=self.project_id)

        # Assert
        mock_discovery.build.assert_called_once_with('compute', 'v1', cache_discovery=False)
        mock_discovery.build.return_value.zones.assert_called_once()
        mock_discovery.build.return_value.zones.return_value.list.assert_called_once_with(project='sample-project-id')
        mock_discovery.build.return_value.zones.return_value.list.return_value.execute.assert_called_once()
        self.assertEqual(obj.zones, ["eu-west-1"])


if __name__ == '__main__':
    main()

包含覆盖率报告的单元测试结果:

代码语言:javascript
复制
.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK
Name                                      Stmts   Miss  Cover   Missing
-----------------------------------------------------------------------
src/stackoverflow/56794377/code.py           14      1    93%   16
src/stackoverflow/56794377/test_code.py      16      0   100%
-----------------------------------------------------------------------
TOTAL                                        30      1    97%

版本:

  • google-api-python-client==1.12.3
  • Python 3.7.5
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56794377

复制
相关文章

相似问题

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