Макет метода, который вызывает исключение несколько раз

#django #python-2.7 #mocking

#django #python-2.7 #издевательство

Вопрос:

Я искал, как это сделать, весь день, но безуспешно. Я использую Django 1.11 и Python 2.7 (нет возможности обновить).

У меня есть метод, который вызывает внешний API. Этот API иногда завершается сбоем с ошибками 504 или 502. Итак, мы решаем, в этом случае, получить вызов несколько раз (на данный момент 3 раза). Итак, я написал что-то вроде этого.

 def call_external_api(arg_1, arg_2):
        attempts = 3
        data = None

        ext_api = ExternalAPI() # wrapper class, its method call the external api
        while attempts > 0:
            try:
                data = ext_api.get_data_details(arg_1=arg_1, arg_2=arg_2)
            except Exception as exception:
                attempts -= 1
                log_message(exception)
                raise ExternalAPIError('Error calling EXT-API: %s' % str(exception))
        return data
 

Итак, я хочу протестировать это, но я не знаю, как имитировать исключение. Я знаю, что его можно использовать @patch(SomeClass, 'method_name') для имитации вызова другого класса, но как имитировать исключение, чтобы код вводился в ветку except и уменьшал «попытку», повторяя цикл?

Примечания: Я подумал, что если я смогу имитировать исключение, я мог бы проверить, что log_message вызывался 3 раза. Что вы думаете об этом подходе?

Ответ №1:

Если вы получаете ответ api в data и он возвращает значение, отличное от 200, вы можете вызвать исключение.

 def call_external_api(arg_1, arg_2):
        attempts = 3
        data = None

        ext_api = ExternalAPI() # wrapper class, its method call the external api
        while attempts > 0:
            try:
                data = ext_api.get_data_details(arg_1=arg_1, arg_2=arg_2)
                if data.status_code != 200:
                   raise Exception("Server Error")
            except Exception as exception:
                attempts -= 1
                log_message(exception)
                raise ExternalAPIError('Error calling EXT-API: %s' % str(exception))
        return data
 

Примечание: get_data_details должен возвращать ответ.