Как импортировать исключение 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