Код: Выделить всё
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")
Код: Выделить всё
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))
В качестве временного решения я решил провести небольшой рефакторинг.
Код: Выделить всё
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")
Я не думаю, что это лучшее решение, поэтому было бы здорово увидеть что-то чище.
Подробнее здесь: https://stackoverflow.com/questions/791 ... d-function