Я хотел бы вызвать исключение в функции, а затем проверить где-то еще (в представлении Django и моих модульных тестах), было ли оно вызвано. В следующем коде используются коды состояния, и он работает. Но я не могу понять, как сделать то же самое с исключениями, которые, по общему мнению, являются правильным способом делать такие вещи.
Для меня важно использовать настраиваемые сообщения об ошибках. Не печатать их, а обнаруживать и использовать в коде (в основном, чтобы пересылать их конечному пользователю с сообщениями Django).
Я понятия не имею, как я буду проверять add_foo_view
, если в utils.add_foo
возникнет исключение.
В модульном тесте я пробовал такие вещи, как assertWarnsRegex(Warning, 'blah went wrong')
, но не удосужился проверить, действительно ли сообщение такое же.
views.py:
from django.contrib import messages
from .utils import add_foo
def add_foo_view(request):
if request.method == 'POST':
status = add_foo(request.POST['bar'])
if not status == 'Bar was added.':
messages.error(request, status)
return render(request, 'index.html')
else:
return render(request, 'add_foo.html')
utils.py:
def add_foo(bar):
if not spamifyable(bar):
return 'Bar can not be spamified.'
try:
eggs = Egg.objects.get(baz=bar)
except:
return 'Bar has no eggs.'
do_things(bar)
return 'Bar was added.'
tests.py:
def test_bar_without_eggs(self):
status = add_foo(eggless_bar)
assertEqual(status, 'Bar has no eggs.')
Я использую Python 3.5.2 и Django 1.11.4.
Изменить: я не совсем уверен, что исключения будут здесь правильным выбором. Я часто читал, что исключения бывают только для неожиданных вещей. Но случаи, которые я улавливаю здесь, — это неверные данные пользователя, которые очень ожидаемы. Поэтому мой вопрос на самом деле не в том, как сделать это с исключениями, а в том, как сделать это правильным и питоническим способом. В любом случае я хочу, чтобы проверка происходила в отдельном utils
месте (обычный Python, не Джанго), а не в представлении.