У меня есть функция, которая отображает 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")
Последний результат приводит к циклическому выдаче исключения, и мне приходится прервать тестовый запуск.
Проблема кажется стандартной и простой решение.
Кто-нибудь сталкивался с подобной проблемой и может предложить способ ее решения?
Исходный тест представляет собой функциональный тест с использованием 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))
Подробнее здесь: https://stackoverflow.com/questions/791 ... d-function
Дать побочный эффект только первому вызову исправленной функции Pytest ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Дать побочный эффект только первому вызову исправленной функции Pytest
Anonymous » » в форуме Python - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Дать побочный эффект только первому вызову исправленной функции Pytest
Anonymous » » в форуме Python - 0 Ответы
- 8 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Дать побочный эффект только первому вызову исправленной функции Pytest
Anonymous » » в форуме Python - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Дать побочный эффект только первому вызову исправленной функции Pytest
Anonymous » » в форуме Python - 0 Ответы
- 15 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Дать побочный эффект только первому вызову исправленной функции Pytest
Anonymous » » в форуме Python - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-