Дать побочный эффект только первому вызову исправленной функции PytestPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Дать побочный эффект только первому вызову исправленной функции Pytest

Сообщение Anonymous »

У меня есть функция, которая отображает HTML-шаблоны. Если во время отрисовки данного шаблона выдается исключение, будет отрисован шаблон по умолчанию (упрощенная версия функции ниже):

Код: Выделить всё

def main(path_to_template):
try:
return render_template(path_to_template)
except Exception:
return render_template('default.html')
Я хотел бы протестировать блок исключений.
В моей тестовой функции я хотел исправить render_template, чтобы он имел побочный эффект Exception .
Однако это должно быть ограничено только первым вызовом, поскольку я хочу, чтобы второй вызов возвращал все, что делает render_template.
Можно ли создать такой тест?
Я пробовал следующие решения, но ни одно не помогло:

Код: Выделить всё

def test_main():
mocker.patch("path.to.render_template", side_effect=Exception("mock exception"))
main("some_path")
Вышеупомянутый подход — первый подход, и он вызовет исключение в обоих вызовах, поэтому не проверит то, что я хочу протестировать.

Код: Выделить всё

def test_main():
mocker.patch("path.to.render_template", side_effect=[Exception("mock exception"), None])
main("some_path")
Вышеупомянутое также не работает, поскольку возвращаемое значение render_template не должно быть None.

Код: Выделить всё

def custom_side_effect(*args):
if args[0] == "some_path":
raise Exception("mock exception")
else:
return render_template(args[0])

def test_main():
mocker.patch("path.to.render_template", side_effect=custom_side_effect)
main("some_path")
Последний результат приводит к циклическому выдаче исключения, и мне приходится прервать тестовый запуск.
Проблема кажется стандартной и простой решение.
Кто-нибудь сталкивался с подобной проблемой и может предложить способ ее решения?
РЕДАКТИРОВАТЬ 1:
Исходный тест представляет собой функциональный тест с использованием Selenium, где Я хочу протестировать сценарий ошибки сервера, который должен привести к отображению страницы ошибки HTTP 500.
Ниже исходной тестируемой функции:

Код: Выделить всё

@login_required(login_url="/login/")
def pages(request):
context = {}
try:
# remove trailing slash to determine a template
path = request.path.rstrip("/")
load_template = path.split("/")[-1]
if load_template == "admin":
return HttpResponseRedirect(reverse("admin:index"))
context["segment"] = load_template
html_template = loader.get_template("home/" + load_template)
except template.TemplateDoesNotExist as e:
html_template = loader.get_template("home/page-404.html")
except Exception as e:
html_template = loader.get_template("home/page-500.html")
return HttpResponse(html_template.render(context, request))
РЕДАКТИРОВАНИЕ 2:
В качестве временного решения я решил провести небольшой рефакторинг.

Код: Выделить всё

def load_home_page(path_to_template):
return loader.get_template(path_to_template)

def load_404_page():
return loader.get_template("home/page-404.html")

def load_500_page():
return loader.get_template("home/page-500.html")
Тогда я исправляю только функцию load_home_page.
Я не думаю, что это лучшее решение, поэтому было бы здорово увидеть что-то чище.

Подробнее здесь: https://stackoverflow.com/questions/791 ... d-function
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»