Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何模拟GoogleAppClient.discovery.build_Python_Unit Testing_Google Cloud Platform_Mocking_Python 3.7 - Fatal编程技术网

Python 如何模拟GoogleAppClient.discovery.build

Python 如何模拟GoogleAppClient.discovery.build,python,unit-testing,google-cloud-platform,mocking,python-3.7,Python,Unit Testing,Google Cloud Platform,Mocking,Python 3.7,我试图模拟API调用compute engine以列出VM的结果。但不幸的是,我们无法模拟精确的函数 我尝试过使用补丁和模拟方法来模拟特定的调用,但仍然不成功 py文件如下所示 导入GoogleAppClient.discovery 导入日志记录 班级服务: 定义初始(自我、项目、事件): self.project\u id=project self.compute=googleapiclient.discovery.build('compute','v1',', cache_discovery

我试图模拟API调用compute engine以列出VM的结果。但不幸的是,我们无法模拟精确的函数

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

py文件如下所示

导入GoogleAppClient.discovery
导入日志记录
班级服务:
定义初始(自我、项目、事件):
self.project\u id=project
self.compute=googleapiclient.discovery.build('compute','v1',',
cache_discovery=False)
self.event=事件
self.zones=self.\u validate\u event()
def_验证_事件(自身):
如果“jsonPayload”不在self.event中:
zones=self.compute.zones().list(
project=self.project\u id).execute()['items']
其他:
zones=self.compute.zones().get(project=self.project\u id,
zone=self.event[“jsonPayload”]
[“资源”][“区域”])。执行()
debug(f“标识的区域为{Zones}”)
返回[区域中的区域的区域[“名称”]
我的测试文件如下所示

#内置
从unittest导入TestCase
从unittest.mock导入修补程序
#习俗
导入代码
类TestServiceModule(TestCase):
def设置(自):
self.project\u id=“示例项目id”
@修补程序('code.googleapiclient.discovery')
def test_uVALIDATE_uEVENT_u与_uEMPTY_u输入(自我、模拟发现):
mock_discovery.build.zones.list.execute.return_value={“items”:[
{
“名称”:“eu-west-1”
}
]}
obj=code.Service(event={},project=self.project\u id)
打印(对象区域)

在上面的测试用例中,我希望在打印obj.zones时看到“eu-west-1”作为值

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

例如

code.py

导入GoogleAppClient.discovery
导入日志记录
班级服务:
定义初始(自我、项目、事件):
self.project\u id=project
self.compute=googleapiclient.discovery.build('compute','v1',cache\u discovery=False)
self.event=事件
self.zones=self.\u validate\u event()
def_验证_事件(自身):
如果“jsonPayload”不在self.event中:
zones=self.compute.zones().list(project=self.project\u id).execute()['items']
其他:
zones=self.compute.zones().get(project=self.project\u id,
zone=self.event[“jsonPayload”][“resource”][“zone”]).execute()
debug(f“标识的区域为{Zones}”)
返回[区域中的区域的区域[“名称”]
test\u code.py

从unittest导入TestCase,main
从unittest.mock导入修补程序
导入代码
类TestService(TestCase):
def设置(自):
self.project\u id=“示例项目id”
@修补程序('code.googleapiclient.discovery')
def test_uVALIDATE_uEVENT_u与_uEMPTY_u输入(自我、模拟发现):
#安排
mock_discovery.build.return_value.zones.return_value.list.return_value.execute.return_value={
“项目”:[{“名称”:“eu-west-1”}]}
#表演
obj=code.Service(event={},project=self.project\u id)
#断言
mock_discovery.build.assert_调用了一次(使用('compute','v1',cache_discovery=False)
mock_discovery.build.return_value.zones.assert_调用_once()
mock_discovery.build.return_value.zones.return_value.list.assert_调用了一次(project='sample-project-id')
mock_discovery.build.return_value.zones.return_value.list.return_value.execute.assert_called_once()
自评资产资格(对象区,[“eu-west-1”])
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
单元测试结果和覆盖率报告:

.
----------------------------------------------------------------------
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%
版本:

  • googleapi python客户端==1.12.3
  • Python 3.7.5

您导入到的修补程序,而不是从中导入的修补程序:
@Patch('code.googleapiclient.discovery.build')
@klauds尝试了您的解决方案,我仍然看到相同的结果