#django #exception #mocking
#django #исключение #издевательство
Вопрос:
Я пытаюсь выполнить модульное тестирование приложения Django и в процессе имитирую вызов базы данных, используя макет следующим образом (где Record — это модель Django):
Record.objects.get = Mock()
Record.objects.get.side_effect = Exception("Record.DoesNotExist") # Exception as a string
и я улавливаю исключение следующим образом:
except Record.DoesNotExist:
return HttpResponseRedirect("http://www.somesite.com")
Затем я получаю следующую ошибку при запуске теста:
Exception: Record.DoesNotExist
Если вместо этого я имитирую исключение следующим образом:
Record.objects.get.side_effect = Exception(Record.DoesNotExist) # Exception as a class
Затем я получаю следующую ошибку при запуске теста:
Exception: <class 'supersales.plugin.models.DoesNotExist'>
Может ли кто-нибудь объяснить, почему он не может перехватить исключение, даже когда есть блок try-except.
Ответ №1:
Вы делаете две разные вещи, ни одна из которых не совпадает с фактическим вызовом Record.DoesNotExist
исключения. Вы можете попробовать их в своей консоли, чтобы увидеть.
Первый — это создание исключения из класса Exception (базового класса для всех исключений) с сообщением «Record.Не существует». Ваша попытка / исключение не улавливает это, потому что она (правильно) улавливает только фактический DoesNotExist
класс.
Второе также вызывает исключение из класса Exception , за исключением того, что на этот раз сообщение является классом Record.DoesNotExist
. Опять же, попытка / исключение не перехватит это, потому что класс исключения — в отличие от сообщения — неверен.
Вместо этого вам просто нужно передать фактический класс exception в side_effect:
Record.objects.get.side_effect = Record.DoesNotExist
Комментарии:
1. Да, я понял это через некоторое время. Как это должно было стать очевидным, я новичок в Python. Тем не менее, большое спасибо за ваш ответ.