J'essaie de créer un UnitTest pour vérifier qu'un objet a été supprimé.
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>'))
Je continue à avoir l'erreur:
DoesNotExist: Answer matching query does not exist.
Vous n'avez pas besoin de l'importer - comme vous l'avez déjà bien écrit, DoesNotExist
est une propriété du modèle lui-même, dans ce cas Answer
.
Votre problème est que vous appelez la méthode get
- ce qui déclenche l'exception - avant qu'elle ne soit passée à assertRaises
. Vous devez séparer les arguments de l'appelable, comme décrit dans la documentation unittest :
self.assertRaises(Answer.DoesNotExist, Answer.objects.get, body__exact='<p>User can reply to discussion.</p>')
ou mieux:
with self.assertRaises(Answer.DoesNotExist):
Answer.objects.get(body__exact='<p>User can reply to discussion.</p>')
Vous pouvez également importer ObjectDoesNotExist
à partir de Django.core.exceptions
, si vous souhaitez qu'un moyen générique, indépendant du modèle, intercepte l'exception:
from Django.core.exceptions import ObjectDoesNotExist
try:
SomeModel.objects.get(pk=1)
except ObjectDoesNotExist:
print 'Does Not Exist!'
DoesNotExist
est toujours une propriété du modèle qui n'existe pas. Dans ce cas, ce serait Answer.DoesNotExist
.
Une chose à surveiller est que le deuxième paramètre de assertRaises
nécessite pour être un appelable - pas simplement une propriété. Par exemple, j'ai eu des difficultés avec cette déclaration:
self.assertRaises(AP.DoesNotExist, self.fma.ap)
mais cela a bien fonctionné:
self.assertRaises(AP.DoesNotExist, lambda: self.fma.ap)
self.assertFalse(Answer.objects.filter(body__exact='<p>User...discussion.</p>').exists())
Voici comment je fais un tel test.
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