2016-12-20 2 views
5

Django में परीक्षण मुझे क्वेरीसेट्स को शामिल करने वाले कार्यों का परीक्षण करने के दो अलग-अलग तरीके मिल गए हैं। पहले एक है:परीक्षण Django क्वेरीसेट्स: self.assertListEqual बनाम self.assertQuerysetEqual

test_instance = FooFactory() 
self.assertListEqual(list(Foo.objects.all()), [test_instance]) 

और दूसरा एक है:

test_instance = FooFactory() 
self.assertQuerysetEqual(Foo.objects.all(), map(repr, [test_instance])) 

इन दोनों में से कौन सा बेहतर है? मैं Django docs से पढ़ा है कि यह क्या assertQuerysetEqual करता है:

का दावा है कि एक क्वेरीसमूह qs मान को मान की विशेष सूची देता है।

क्यू और मानों की सामग्री की तुलना फ़ंक्शन ट्रांसफॉर्म का उपयोग करके की जाती है; डिफ़ॉल्ट रूप से, इसका मतलब है कि प्रत्येक मान के repr() की तुलना की जाती है। किसी भी अन्य कॉल करने योग्य का उपयोग किया जा सकता है यदि repr() एक अद्वितीय या सहायक तुलना प्रदान नहीं करता है।

डिफ़ॉल्ट रूप से, तुलना भी निर्भर करने का आदेश दे रही है। यदि qs एक निहित आदेश प्रदान नहीं करता है, तो आप आदेशित पैरामीटर को गलत पर सेट कर सकते हैं, जो तुलना को संग्रह में बदल देता है। काउंटर तुलना। अगर आदेश अपरिभाषित है (यदि दिए गए क्यू का आदेश नहीं दिया गया है और तुलना एक से अधिक आदेशित मानों के खिलाफ है), तो ValueError उठाया जाता है।

मैं दो महत्वपूर्ण बातें यहाँ देखें: एक है कि प्रत्येक मान के repr() तुलना की जाती है है, और अन्य कि assertQuerysetEqual आप वैकल्पिक आदेश देने बनाने के लिए अनुमति देता है।

पहली बात के लिए, मुझे लगता है कि मॉडल repr मानों के बजाय मॉडल की तुलना करना बेहतर है, तब से आप जानते हैं कि वे बिल्कुल वही हैं (हालांकि कोई भी तर्क दे सकता है कि repr मान अलग होना चाहिए)।

दूसरे के लिए, मैं देख सकता हूं कि कितनी असाधारण तुलना उपयोगी हो सकती है। फिर फिर, यदि आप विशेष रूप से कुछ परीक्षण कर रहे हैं जहां ऑर्डरिंग महत्वपूर्ण नहीं है/आसानी से अनुकरण किया जाता है, तो मुझे वहां लाभ दिखाई नहीं देता है।

एकमात्र तर्क जिसे मैं assertQuerysetEqual (उपरोक्त उन धारणाओं के साथ) के बारे में सोच सकता हूं, यह है कि यह इसके उद्देश्य के बारे में अधिक पठनीय/प्रत्यक्ष है।

क्या self.assertListEqual(list(<queryset>), [<expected_models_in_correct_order>]) और self.assertQuerysetEqual(<queryset>, map(repr, [<expected_models_in_correct_order>]) के बीच कोई व्यावहारिक अंतर है कि मैं खाता करने में विफल रहा?

उत्तर

0

एकमात्र व्यावहारिक अंतर यह है कि पाइथन ऑब्जेक्ट और स्ट्रिंग तुलना कैसे करता है।

self.assertListEqual: __eq__ विधि को प्रस्तुत मॉडल उदाहरणों की तुलना सूची जो तुलना करता है कि तुलना कैसे की जाती है। See how Django does comparison for model instances

self.assertQuerysetEqual: प्रत्येक स्ट्रिंग में प्रत्येक वर्ण के ord मान का उपयोग करके स्ट्रिंग की तुलना सूची।

इस पर निर्भर करता है कि __eq__ और __repr__ ऑब्जेक्ट के लिए लागू किया गया है, तो कोई दूसरे पर थोड़ा प्रदर्शन लाभ प्रदान कर सकता है।

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