2009-08-20 11 views
7

क्या कोई मुझे बता सकता है कि पोस्टग्रेस डीबी त्रुटियों, विशेष रूप से IntegrityError का सही तरीके से परीक्षण कैसे करें। उदाहरण के लिए मैं अगले परीक्षण है:django Postgres IntegrityError

class TestSlugs(TestCase): 
    # This slug must be unique 
    b = BookPublisher(slug=self.duplicate_slug) 
    self.assertRaises(IntegrityError, b.save) 

    #check if there's only one BookPublisher 
    self.assertEquals(BookPublisher.objects.count(), 1) 

यहाँ यह IntegrityError पकड़ता है, लेकिन फिर सब संक्रिया असफल हो जायेगी, क्योंकि है कि कैसे काम करता है postgres, ठीक है। मैं दस्तावेज़ों में देखता हूं कि मैं लेनदेन का उपयोग कर सकता हूं .rollback() लेकिन कहां: परीक्षण में या सहेजने() विधि में?

इसके अलावा, मुझे हाथ से रोलबैक लिखने का विचार पसंद नहीं है, क्यों नहीं django बस सहेजने का प्रयास कर सकता है, और यदि यह विफल रहता है - मुझे ईमानदारी त्रुटि दें और मुझे काम जारी रखने दें।

मैं Django उपयोग कर रहा हूँ 1.1

उत्तर

2

बचाने() विधि में परिवर्तन नहीं करते हैं, क्योंकि आप यह करना चाहते हैं सामान्य संचालन के माध्यम से प्रचार। आपको अपने टेस्ट क्लास और रोलबैक में अपवाद पकड़ना चाहिए (ध्यान दें कि जब आप लेनदेन का परीक्षण कर रहे हैं तो आपको सामान्य टेस्टकेस के बजाय ट्रांसएक्शनलटेस्टकेस को उप-वर्गीकृत करना होगा)।

+0

ठीक है धन्यवाद। तो लाइव कोड में, IntegrityError को पकड़ने के बाद सब ठीक हो जाएगा? या मुझे अभी भी स्पष्ट रूप से रोलबैक करना चाहिए? –

+0

आपको कभी भी अपने कोड में IntegrityError का कारण बनना चाहिए, और किसी भी SQL त्रुटि को बग के रूप में व्यवहार करना चाहिए। इसलिए आपको कुछ संशोधन करने से पहले जांच करनी चाहिए कि क्या यह संशोधन समझदार होगा। यदि आपको लगता है कि संशोधन नहीं किया जा सकता है, तो आप रोलबैक कर सकते हैं और उपयोगकर्ता को समस्या की रिपोर्ट कर सकते हैं। या आप संशोधन को छोड़ने या इसके बजाय एक अलग संशोधन करने का निर्णय ले सकते हैं। –

2

नहीं 100% यकीन है कि यह मान्य है, लेकिन तुम कर सकते हो:

def save(self): 
    transaction.commit() 
    try: 
     super(MyModel, self).save() 
    except IntegrityError: 
     transaction.rollback() 
    else: 
     transaction.commit() 
+0

धन्यवाद, मैं कोशिश करूँगा। लेकिन स्पष्ट रूप से बोलते हुए, यह बदसूरत है :) –

संबंधित मुद्दे