Как импортировать исключение Django DoNotExist?
Я пытаюсь создать UnitTest, чтобы проверить, что объект удален.
from django.utils import unittest
def test_z_Kallie_can_delete_discussion_response(self):
...snip...
self._driver.get("http://localhost:8000/info/3/want-a-discussion")
self.assertRaises(Answer.DoesNotExist, Answer.objects.get(body__exact = '<p>User can reply to discussion.</p>'))
Я продолжаю получать ошибку:
DoesNotExist: Answer matching query does not exist.
Ответы
Ответ 1
Вам не нужно импортировать его - как вы уже правильно написали, DoesNotExist
является свойством самой модели, в данном случае Answer
.
Ваша проблема в том, что вы вызываете метод get
- который вызывает исключение - перед тем, как он будет передан в assertRaises
. Вам нужно отделить аргументы от вызываемого, как описано в документации unittest:
self.assertRaises(Answer.DoesNotExist, Answer.objects.get, body__exact='<p>User can reply to discussion.</p>')
или лучше:
with self.assertRaises(Answer.DoesNotExist):
Answer.objects.get(body__exact='<p>User can reply to discussion.</p>')
Ответ 2
Вы также можете импортировать ObjectDoesNotExist
из django.core.exceptions
, если вы хотите, чтобы общий, не зависящий от модели способ поймать исключение:
from django.core.exceptions import ObjectDoesNotExist
try:
SomeModel.objects.get(pk=1)
except ObjectDoesNotExist:
print 'Does Not Exist!'
Ответ 3
DoesNotExist
всегда является свойством модели, которая не существует. В этом случае это будет Answer.DoesNotExist
.
Ответ 4
Остерегайтесь того, что второй параметр assertRaises
должен быть вызываемым, а не просто свойством. Например, у меня возникли трудности с этим утверждением:
self.assertRaises(AP.DoesNotExist, self.fma.ap)
но это сработало нормально:
self.assertRaises(AP.DoesNotExist, lambda: self.fma.ap)
Ответ 5
self.assertFalse(Answer.objects.filter(body__exact='<p>User...discussion.</p>').exists())
Ответ 6
Вот как я делаю такой тест.
from foo.models import Answer
def test_z_Kallie_can_delete_discussion_response(self):
...snip...
self._driver.get("http://localhost:8000/info/3/want-a-discussion")
try:
answer = Answer.objects.get(body__exact = '<p>User can reply to discussion.</p>'))
self.fail("Should not have reached here! Expected no Answer object. Found %s" % answer
except Answer.DoesNotExist:
pass # all is as expected