Як імпортувати виняток Django DoesNotExist?


122

Я намагаюся створити UnitTest, щоб перевірити, чи об’єкт видалено.

from django.utils import unittest
def test_z_Kallie_can_delete_discussion_response(self):
  ...snip...
  self._driver.get("http://localhost:8000/questions/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.

Не пов’язаний із моєю відповіддю нижче, це виклик get () видалення відповіді, про який йдеться? Якщо так, то насправді це повинно бути ВИДАЛЕНО, а не ГЕТ.
Стів Ялім

Відповіді:


136

Не потрібно їх імпортувати - як ви вже правильно написали DoesNotExist, в цьому випадку є властивістю самої моделіAnswer .

Ваша проблема полягає в тому, що ви викликаєте getметод - який викликає виняток - до його передачіassertRaises . Вам потрібно відокремити аргументи від виклику, як описано в документації на одиницю тестування :

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>')

1
Хороша відповідь, лише перший із наведених фрагментів буде сприйматися як недійсний синтаксис (принаймні, Python 2.7). Потрібно, self.assertRaises(Answer.DoesNotExist, Answer.objects.get, body__exact = '<p>User can reply to discussion.</p>')тобто з getаргументами s, доданими як окремі аргументи kw, а не всередині a ().
Мартін Б.

1
Ой, звичайно! Мені тут здається, що Дороті. Я шукав високий і низький, тільки щоб знайти це було зі мною весь час!
Nick S

Python 3.6 / Django 2.2 withпрацював лише для мене.
терус

183

Ви також можете імпортувати ObjectDoesNotExistз django.core.exceptions, якщо ви хочете загальний, незалежний від моделі спосіб знайти виняток:

from django.core.exceptions import ObjectDoesNotExist

try:
    SomeModel.objects.get(pk=1)
except ObjectDoesNotExist:
    print 'Does Not Exist!'

10

DoesNotExistзавжди є властивістю моделі, яка не існує. У цьому випадку це було б Answer.DoesNotExist.


3

Одне, на що слід звернути увагу, - це те, що другий параметр assertRaises повинен бути викликом - а не лише властивість. Наприклад, у мене виникли труднощі з цим твердженням:

self.assertRaises(AP.DoesNotExist, self.fma.ap)

але це спрацювало чудово:

self.assertRaises(AP.DoesNotExist, lambda: self.fma.ap)

3
self.assertFalse(Answer.objects.filter(body__exact='<p>User...discussion.</p>').exists())

Це не відповідає точно на запитання. Але це все-таки приємне рішення, пропонуючи інший підхід, щоб отримати бажаний результат.
cezar

0

Ось як я роблю таке тестування.

from foo.models import Answer

def test_z_Kallie_can_delete_discussion_response(self):

  ...snip...

  self._driver.get("http://localhost:8000/questions/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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.