Имитирующие вызовы базы данных Django

#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. Тем не менее, большое спасибо за ваш ответ.