Python MagicMock.return_value 返回 MagicMock 而不是 return_value
Python MagicMock.return_value returning MagicMock instead of return_value
我有一个函数可以验证给定的输入字符串是否是正确的 GCP 区域:
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))
我正在尝试编写一个测试来验证这一点,但我无法正确模拟 compute 方法的输出。
@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 在开发时是正确的在测试中。
zone_response = MagicMock name='discovery.build().zones().get().execute()' id='139870134525456'
zone_response.return_value = {'status': 'status', 'region': 'region', 'name': 'name'}
对我做错了什么有什么想法吗?很长一段时间以来,我一直在尝试为此编写测试,所以也许我的方法刚刚结束。
原来问题出在测试中execute方法的()上。所以正确的测试应该是:
@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
我有一个函数可以验证给定的输入字符串是否是正确的 GCP 区域:
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))
我正在尝试编写一个测试来验证这一点,但我无法正确模拟 compute 方法的输出。
@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 在开发时是正确的在测试中。
zone_response = MagicMock name='discovery.build().zones().get().execute()' id='139870134525456'
zone_response.return_value = {'status': 'status', 'region': 'region', 'name': 'name'}
对我做错了什么有什么想法吗?很长一段时间以来,我一直在尝试为此编写测试,所以也许我的方法刚刚结束。
原来问题出在测试中execute方法的()上。所以正确的测试应该是:
@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