Дразнящие вызовы базы данных Django - PullRequest
0 голосов
/ 13 апреля 2011

Я пытаюсь выполнить модульное тестирование приложения Django и в процессе имитации вызова базы данных, используя Mock следующим образом (где 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-Кроме.

1 Ответ

2 голосов
/ 13 апреля 2011

Вы делаете две разные вещи, ни одна из которых не является тем же, что фактически вызывает исключение Record.DoesNotExist. Вы можете попробовать их в консоли, чтобы увидеть.

Первый вызывает исключение класса Exception (базовый класс для всех исключений) с сообщением «Record.DoesNotExist». Ваша попытка / исключение не ловит его, потому что он (правильно) только ловит фактический DoesNotExist класс.

Второй также вызывает исключение класса Exception, за исключением того, что на этот раз сообщение является классом Record.DoesNotExist. Опять же, попытка / исключение не перехватит его, потому что класс исключения - в отличие от сообщения - неверен.

Вместо этого вам просто нужно передать фактический класс исключений в side_effect:

Record.objects.get.side_effect = Record.DoesNotExist
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...