2012-06-19 11 views
90

Próbuję utworzyć UnitTest, aby sprawdzić, czy obiekt został usunięty.Jak zaimportować wyjątek Django DoesNotExist?

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

Wciąż dostaję błąd:

DoesNotExist: Answer matching query does not exist. 
+0

niezwiązane z moją odpowiedź poniżej, jest to, że dostać() wezwanie usunięcie odpowiedź w pytaniu? Jeśli tak, to naprawdę powinno być DELETE, a nie GET. –

Odpowiedz

104

Nie trzeba go importować - jak już poprawnie napisane, DoesNotExist jest właściwością samego modelu, w tym przypadku Answer.

Twój problem polega na tym, że wywołujesz metodę get - która podnosi wyjątek - zanim zostanie przekazana do assertRaises. Trzeba oddzielić argumenty z wymagalne, jak opisano w unittest documentation:

self.assertRaises(Answer.DoesNotExist, Answer.objects.get, body__exact='<p>User can reply to discussion.</p>') 

lub lepiej:

with self.assertRaises(Answer.DoesNotExist): 
    Answer.objects.get(body__exact='<p>User can reply to discussion.</p>') 
+1

Dobra odpowiedź, tylko pierwszy z powyższych fragmentów zostanie złapany jako niepoprawna składnia (przynajmniej w Pythonie 2.7). Powinien to być 'self.assertRaises (Answer.DoesNotExist, Answer.objects.get, body__exact = '

Użytkownik może odpowiedzieć do dyskusji:

') '- tj. z argumentami' get' dodanymi jako pojedyncze argumenty kw, nie wewnątrz '()'. –

+1

Augh, oczywiście! Czuję się tu jak Dorothy. Szukałem wysokiego i niskiego poziomu, tylko po to, by stwierdzić, że był ze mną cały czas! –

8

DoesNotExist zawsze jest właściwość modelu, który nie istnieje. W tym przypadku będzie to Answer.DoesNotExist.

140

Można także importować ObjectDoesNotExist z django.core.exceptions, jeśli chcesz rodzajowe, model niezależny sposób, aby złapać wyjątek:

from django.core.exceptions import ObjectDoesNotExist 

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

to jak zrobić taki 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 
2

jedna rzecz, aby zwrócić uwagę na to, że drugi parametr assertRaisespotrzebuje do być wezwanym - nie tylko nieruchomością. Na przykład, miałem trudności z tym stwierdzeniem:

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

ale to działało w porządku:

self.assertRaises(AP.DoesNotExist, lambda: self.fma.ap) 
1
self.assertFalse(Answer.objects.filter(body__exact='<p>User...discussion.</p>').exists()) 
Powiązane problemy