2013-04-17 7 views
14

मैं इस प्रकारकी तुलना क्वेरीसमूहों testcase

def simple_view(request): 
    documents = request.user.document_set.all() 
    return render(request, 'simple.html', {'documents': documents}) 

ऊपर दृश्य परीक्षण करने के लिए अपने परीक्षण के मामले में मैं निम्न विधि जो त्रुटियों बाहर है एक बहुत ही सरल दृष्टिकोण है।

Class SomeTestCase(TestCase): 
    # ... 
    def test_simple_view(self): 
     # ... some other checks 
     docset = self.resonse.context['documents'] 
     self.assertTrue(self.user.document_set.all() == docset) # This line raises an error 
    # ... 

मुझे जो त्रुटि मिली है वह AssertionError: False is not true है। मैंने दोनों क्वेरीसेट प्रिंट करने का प्रयास किया है और दोनों बिल्कुल समान हैं। यह False क्यों वापस आएगा जब दोनों वस्तुएं समान होंगी? कोई विचार ?

वर्तमान में इस पर काबू पाने के लिए, मैं जाँच लंबाई की एक बुरा हैक उपयोग कर रहा हूँ इस प्रकार है:

ds1, ds2 = self.response.context['documents'], self.user.document_set.all() 
self.assertTrue(len([x for x in ds1 if x in ds2]) == len(ds1) == len(ds2)) # Makes sure each entry in ds1 exists in ds2 

उत्तर

19

क्वेरीसमूह वस्तुओं समान ही वे अलग प्रश्नों के परिणाम हैं, भले ही वे एक ही मान नहीं किया जाएगा उनके परिणाम में (ds1.query और ds2.query की तुलना करें)।

आप क्वेरी पहले एक सूची के लिए सेट परिवर्तित करते हैं, तो आप एक सामान्य तुलना (यह मानते हुए वे निश्चित रूप से एक ही प्रकार का आदेश है) करने के लिए सक्षम होना चाहिए:

self.assertEqual(list(ds1), list(ds2)) 
+0

yup, बस समाधान मिला। धन्यवाद। – Amyth

+1

या मामूली अधिक संक्षेप में self.assertEqual (सूची (डीएस 1), सूची (डीएस 2)) – igniteflow

0

मिले एक समाधान। हमें उनकी तुलना करने से पहले क्रमबद्ध सूचियों के लिए Querysets को परिवर्तित करने की आवश्यकता है। निम्नानुसार कुछ।

Class SomeTestCase(TestCase): 
    # ... 
    def test_simple_view(self): 
     # ... some other checks 
     docset1 = self.resonse.context['documents'] 
     docset2 = self.user.document_set.all() 
     self.assertTrue(list(sorted(docset1)) == len(sorted(docset))) 
    # ... 
6

यह विकल्प छँटाई की जरूरत नहीं है:

self.assertQuerysetEqual(qs1, list(qs2), ordered=False) 

assert reference देखें।

नोट: केवल django 1.4+ के लिए।

+0

कोशिश की, लेकिन क्वेरीसेट हर समय बराबर नहीं होते हैं (भले ही वे वही हों)! यह उपयोग करके काम किया: 'self.assertQuerysetEqual (qs1, मानचित्र (repr, qs2), आदेश दिया गया = गलत)'। इस धागे से: http://stackoverflow.com/a/14189017/821594 – stalk

+0

@ स्टॉक मुझे वास्तव में पता नहीं क्यों ... यह डिफ़ॉल्ट रूप से तुलना करने के लिए 'repr()' का उपयोग करना है। और यदि दोनों quesysets बराबर हैं repr एक जैसा होने की उम्मीद है, है ना? –

+2

[डॉक्स] पर देख रहे हैं (https://docs.djangoproject.com/en/1.5/topics/testing/overview/#django.test.TestCase.assertQuerysetEqual) मैंने सोचा था कि आपका उदाहरण काम करेगा। लेकिन ऐसा नहीं लगता है ... 'repr' func केवल पहली गैर-सूची क्वेरीसेट पर लागू होता है, और दूसरी सूची के लिए इसे स्पष्ट रूप से सराहना की जानी चाहिए। Django 1.4.5 के साथ: 'qs1 = M.objects.all(); qs2 = M.objects.all() # (वही) ', 'self.assertQuerysetEqual (qs1, सूची (qs2), आदेश दिया गया = गलत)' <- विफल रहता है; 'self.assertQuerysetEqual (qs1, मानचित्र (repr, qs2), आदेश दिया गया = गलत)' <- गुजरता है; – stalk

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