#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 должен возвращать ответ.