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>])
के बीच कोई व्यावहारिक अंतर है कि मैं खाता करने में विफल रहा?