मैं 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.

नीचे दिए गए मेरे उत्तर से संबंधित है, क्या प्रश्न में उत्तर को हटाना () कॉल है? यदि हां, तो वास्तव में एक DELETE होना चाहिए, एक 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
अच्छा जवाब, उपरोक्त स्निपेट में से केवल एक को अमान्य सिंटैक्स के रूप में पकड़ा जाएगा (कम से कम पायथन 2.7)।, होना चाहिए self.assertRaises(Answer.DoesNotExist, Answer.objects.get, body__exact = '<p>User can reply to discussion.</p>')- यानी getव्यक्तिगत तर्क के रूप में जोड़े गए तर्क के साथ , न कि अंदर ()
मार्टिन बी।

1
ऑग, बिल्कुल! मुझे यहां डोरोथी जैसा लगता है। मैं उच्च और निम्न को खोज रहा था, केवल इसे खोजने के लिए मेरे साथ था!
निक एस

अजगर 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())

यह अनुरोध के अनुसार प्रश्न का उत्तर नहीं देता है। लेकिन यह अभी भी एक अच्छा समाधान है, वांछित परिणाम प्राप्त करने के लिए एक अलग दृष्टिकोण प्रदान करता है।
सीज़र

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.