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 () 호출이 해당 답변을 삭제합니까? 그렇다면 실제로는 GET이 아닌 DELETE 여야합니다.
Steve Jalim 2012-06-19

답변:


136

이미 올바로 작성 했으므로 가져올 필요가 없습니다 . 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>')

1
좋은 대답은 위의 스 니펫 중 첫 번째 스 니펫 만 유효하지 않은 구문으로 잡힐 것입니다 (적어도 Python 2.7에서는). self.assertRaises(Answer.DoesNotExist, Answer.objects.get, body__exact = '<p>User can reply to discussion.</p>')즉, get의 인수가 ().
Martin B.

1
물론 이죠! 여기 도로시가 된 것 같아요. 나는 높고 낮은 곳을 찾고 있었는데, 그것이 나와 함께 있다는 것을 발견했습니다!
Nick S

Python 3.6 / Django 2.2 with는 저 에게만 해결책이되었습니다.
theruss

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.