Дать побочный эффект только первому вызову исправленной функции 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")

Последний результат приводит к циклическому выдаче исключения, и мне приходится прервать тестовый запуск.
Проблема кажется стандартной и простой решение.
Кто-нибудь сталкивался с подобной проблемой и может предложить способ ее решения?
Исходный тест представляет собой функциональный тест с использованием 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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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