2015-03-24 9 views
6

के साथ Django TransactionTestCase मैं अजगर 2.7.7 का उपयोग कर पाइथन 2.7.6 और पोस्टग्रेज़ डेटाबेस के रूप में कर रहा हूं और मुझे TransactionTestCase के साथ समस्या थी। मेरे माइग्रेशन में मेरे पास दो डेटामैग्रेशन था और मैं चाहता था कि वे परीक्षण के दौरान उपलब्ध हों, इसलिए मैंने अपने टेस्ट केस (https://docs.djangoproject.com/en/1.7/topics/testing/overview/#test-case-serialized-rollback) में serialized_rollback = True जोड़ा।रोलबैक इम्यूलेशन

परीक्षण मामलों के पहले टेस्ट ठीक था, लेकिन फिर Django एक IntegrityError साथ यह शिकायत करते हुए:

IntegrityError: duplicate key value violates unique constraint "django_content_type_app_label_6032a1f08b99c274_uniq" 
DETAIL: Key (app_label, model)=(admin, logentry) already exists. 

मैं परीक्षण चलाने के लिए और अपनी सेटिंग्स के लिए निम्न जोड़कर इस त्रुटि से बचने में कामयाब (https://docs.djangoproject.com/en/1.7/ref/settings/#std:setting-TEST_NON_SERIALIZED_APPS):

TEST_NON_SERIALIZED_APPS = ['django.contrib.contenttypes', 
          'django.contrib.auth'] 

लेकिन मुझे यह जानना है कि इसकी आवश्यकता क्यों है? क्या यह रोलबैक में एक बग है या क्या यह मेरी तरफ एक समस्या है?

+0

तुम बस मेरी TransactionTestCase परीक्षण के साथ एक बहुत बड़ी समस्या से बचने के लिए मुझे मदद की। मैंने अभी तक TEST_NON_SERIALIZED_APPS के बारे में कभी नहीं सुना है। धन्यवाद। मुझे लगता है कि ऐसा इसलिए है क्योंकि TransactionTestCase टूटा हुआ लगता है। मेरा कोड 1.7.2 के साथ काम किया, यह TEST_NON_SERIALIZED_APPS के बिना 1.7.8 पर बंद हुआ। मैं (धीरे-धीरे) py.test पर जा रहा हूं, मुझे लगता है कि pytest-django फिक्स्चर मुझे इसके साथ मदद करेगा। अंततः। आपके प्रश्न के लिए मेरा जवाब? मुझे लगता है कि आपने सबकुछ ठीक किया है और यह पूरे जिम्नास्टिक को Django 1.7 एटीएम के साथ जरूरी है। – dotz

+0

मैं सहमत हूं, यह एक प्रश्न है और सभी में एक जवाब है। बहुत धन्यवाद! मुझे यकीन नहीं है कि Django डिफ़ॉल्ट रूप से उन ऐप्स को क्रमबद्ध क्यों नहीं करता है, क्योंकि मेरे मामले में यह आपके द्वारा सुझाए गए TEST_NON_SERIALIZED_APPS सेट के बिना काम नहीं करता है। –

उत्तर

2

यह समस्या वास्तव में अच्छी तरह Django संबंधित टिकट समझाया गया है: https://code.djangoproject.com/ticket/23727

वहाँ से उद्धरित:

= सच serialized_rollback के साथ एक TransactionTestCase का उपयोग करते समय डेटाबेस बनाने और उसके माइग्रेशन (के साथ चलाने के बाद, post_migrate सिग्नल उत्सर्जित करना), डेटाबेस की सामग्री को _test_serialized_contents पर क्रमबद्ध किया जाता है।

पहले टेस्ट केस के बाद, _fixture_teardown() टेबल को फ्लश करेगा लेकिन फिर post_migrate सिग्नल उत्सर्जित हो जाएगा और नई पंक्तियां (नए पीके के साथ) django_content_type तालिका में बनाई जाएंगी।

फिर किसी सूट में किसी भी परीक्षण के मामलों में _fixture_setup() _test_serialized_contents की सामग्री को deserialize करने का प्रयास करता है, लेकिन ये पंक्तियां उनके पीके को छोड़कर डेटाबेस में पहले से ही पंक्तियों के समान हैं।

यह django_content_type तालिका में अद्वितीय बाधा के कारण एक इंटीग्रिटी त्रुटि का कारण बनता है।

एक पैच बनाया/जारी किया गया है, लेकिन केवल Django 1.9.x के लिए।

पिछले संस्करणों के लिए, आप TEST_NON_SERIALIZED_APPS उपयोग जारी रखना चाहिए मुझे लगता है कि ...

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