Python 如何模拟GoogleAppClient.discovery.build
我试图模拟API调用compute engine以列出VM的结果。但不幸的是,我们无法模拟精确的函数 我尝试过使用补丁和模拟方法来模拟特定的调用,但仍然不成功 py文件如下所示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
导入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尝试了您的解决方案,我仍然看到相同的结果