Python MagicMock.return_value, возвращающий MagicMock вместо return_value - PullRequest
0 голосов
/ 27 марта 2020

У меня есть функция, которая проверяет, является ли данная входная строка правильной зоной 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))

Я пытаюсь написать тест, чтобы проверить это, но я не могу высмеивать вывод правильно вычислить метод.

@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'}

Есть идеи, что я делаю не так? Я пытался написать тесты для этого в течение достаточно долгого времени, так что, возможно, мой подход просто не работает

1 Ответ

0 голосов
/ 30 марта 2020

Оказывается, проблема заключалась в () метода 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

...