एक रिपॉजिटरी जो आपके डोमेन से आपके DAL फ्रेमवर्क पर अनुवाद करती है, जैसे कि NHibernate या Doctrine, या आपकी SQL-execing कक्षाएं। इसका मतलब यह है कि आपका भंडार अपने कर्तव्यों को पूरा करने के लिए उक्त ढांचे पर तरीकों को कॉल करेगा: आपका भंडार डेटा को लाने के लिए आवश्यक प्रश्नों का निर्माण करता है। यदि आप ORM- फ्रेमवर्क का उपयोग नहीं कर रहे हैं (मुझे आशा है कि आपके हैं ...), रिपॉजिटरी वह जगह होगी जहां कच्चे SQL- स्टेटमेंट बनाए जाते हैं।
इन तरीकों में से सबसे बुनियादी है सेव: ज्यादातर मामलों में यह ऑब्जेक्ट को कार्य की इकाई (या सत्र) पर रिपॉजिटरी से पास करेगा।
public void Save(Car car)
{
session.Save(car);
}
लेकिन आइए एक और उदाहरण देखते हैं, उदाहरण के लिए एक कार को अपनी आईडी द्वारा लाना। ऐसा लग सकता है
public function GetCarWithId(String id)
{
return Session.QueryOver<Car>()
.Where(x => x.Id == id)
.SingleOrDefault();
}
अभी भी बहुत जटिल नहीं है, लेकिन आप कई स्थितियों के साथ कल्पना कर सकते हैं (2010 में 'वोक्सवैगन' समूह के सभी ब्रांडों के लिए बनाई गई सभी कारें प्राप्त करें) यह मुश्किल हो जाता है। तो सही TDD फैशन में आपको यह परीक्षण करने की आवश्यकता है। इसे करने बहुत सारे तरीके हैं।
विकल्प 1: ओआरएम फ्रेमवर्क में की गई कॉल को मॉक करें
ज़रूर, आप सत्र-वस्तु का मज़ाक उड़ा सकते हैं और केवल यह कह सकते हैं कि सही कॉल किए गए हैं। हालांकि यह रिपॉजिटरी का परीक्षण करता है, यह वास्तव में परीक्षण- संचालित नहीं है क्योंकि आप सिर्फ यह परीक्षण कर रहे हैं कि रिपॉजिटरी आंतरिक रूप से उस तरह से दिखती है जैसा आप इसे चाहते हैं। परीक्षण मूल रूप से 'कोड को इस तरह दिखना चाहिए' कहता है। फिर भी, यह एक मान्य दृष्टिकोण है लेकिन ऐसा लगता है कि इस तरह के परीक्षण का बहुत कम मूल्य है।
विकल्प 2: (Re) डेटाबेस को परीक्षणों से बनाएँ
कुछ DAL- चौखटे आपको डेटाबेस का पूरा ढांचा तैयार करने की क्षमता देती हैं, जो आपके द्वारा टेबल पर डोमेन को मैप करने के लिए बनाई गई मैपिंग फाइलों के आधार पर होती हैं। इन चौखटे के लिए, रिपॉजिटरी का परीक्षण करने का तरीका अक्सर परीक्षण के पहले चरण में इन-मेमोरी डेटाबेस के साथ डेटाबेस बनाने और इन-मेमोरी डेटाबेस में डीएएल-फ्रेमवर्क का उपयोग करके वस्तुओं को जोड़ने का होता है। इसके बाद, आप इन-मेमोरी डेटाबेस पर रिपॉजिटरी का उपयोग करके परीक्षण कर सकते हैं कि क्या विधियाँ काम करती हैं। ये परीक्षण धीमे हैं, लेकिन बहुत वैध हैं और आपके परीक्षणों को चलाते हैं। इसमें आपके DAL- फ्रेमवर्क से कुछ सहयोग की आवश्यकता होती है।
विकल्प 3: एक वास्तविक डेटाबेस पर परीक्षण करें
एक अन्य दृष्टिकोण एक वास्तविक डेटाबेस पर परीक्षण करना और सबसे योग्य को अलग करना है। आप इसे कई तरीकों से कर सकते हैं: एक लेनदेन के साथ अपने परीक्षणों को घेरें, मैन्युअल रूप से साफ करें (बनाए रखने के लिए बहुत कठिन अनुशंसा नहीं करेंगे), प्रत्येक चरण के बाद डेटाबेस को पूरी तरह से पुनर्निर्माण करें ... आपके द्वारा बनाए जा रहे आवेदन के आधार पर या हो सकता है संभव नहीं है। अपने अनुप्रयोगों में मैं पूरी तरह से स्रोत नियंत्रण से एक स्थानीय विकास डेटाबेस का निर्माण कर सकता हूं और रिपॉजिटरी पर मेरे unittests लेनदेन का उपयोग एक दूसरे से परीक्षणों को पूरी तरह से अलग करने के लिए करते हैं (खुले लेनदेन, डेटा डालें, परीक्षण भंडार, रोलबैक लेनदेन)। प्रत्येक बिल्ड पहले स्थानीय विकास डेटाबेस को सेट करता है और फिर उस स्थानीय विकास डेटाबेस पर रिपॉजिटरी के लिए लेनदेन-पृथक यूनिटैस्ट करता है। यह
DAL का परीक्षण न करें
यदि आप NHibernate जैसे DAL फ्रेमवर्क का उपयोग कर रहे हैं, तो उस रूपरेखा का परीक्षण करने की आवश्यकता से बचें। आप अपनी मैपिंग फ़ाइलों को सहेजकर, पुनर्प्राप्त करके और फिर एक डोमेन ऑब्जेक्ट की तुलना करके सुनिश्चित कर सकते हैं कि सब कुछ ठीक है (किसी भी प्रकार की कैशिंग को अक्षम करना सुनिश्चित करें), लेकिन यह उतना आवश्यक नहीं है जितना कि अन्य परीक्षण आपको लिखना चाहिए। मैं यह ज्यादातर बच्चों पर स्थितियों के साथ माता-पिता पर संग्रह के लिए करता हूं।
अपनी रिपॉजिटरी की वापसी का परीक्षण करते समय आप यह देखने के लिए जांच सकते हैं कि आपके डोमेन ऑब्जेक्ट पर कुछ पहचानने वाली संपत्ति मेल खाती है या नहीं। यह एक आईडी हो सकता है लेकिन परीक्षणों में यह अक्सर मानव पठनीय संपत्ति की जांच करने के लिए अधिक फायदेमंद होता है। 'मुझे 2010 के बाद की सभी कारों को प्राप्त करें ....' में यह जांचा जा सकता है कि पाँच कारें वापस लौटी हैं और लाइसेंस प्लेटें 'यहाँ सूची डालें' हैं। अतिरिक्त लाभ यह है कि यह आपको छंटनी के बारे में सोचने के लिए मजबूर करता है और आपका परीक्षण स्वचालित रूप से छँटाई के लिए मजबूर करता है। आपको आश्चर्य होगा कि कितने एप्लिकेशन या तो कई बार सॉर्ट करते हैं (डेटाबेस से सॉर्ट किए गए रिटर्न, व्यू ऑब्जेक्ट बनाने से पहले सॉर्ट करें और फिर व्यू ऑब्जेक्ट को सॉर्ट करें, सभी एक ही प्रॉपर्टी पर केस में ) या निहित रूप से रिपॉजिटरी सॉर्ट और गलती से हटा दें रास्ते में कुछ यूआई तोड़कर।
Test यूनिट टेस्ट ’सिर्फ एक नाम है
मेरी राय में, यूनिट परीक्षणों को ज्यादातर डेटाबेस को हिट नहीं करना चाहिए । आप एक एप्लिकेशन का निर्माण करते हैं ताकि किसी स्रोत से डेटा की आवश्यकता वाले कोड का प्रत्येक टुकड़ा एक रिपॉजिटरी के साथ ऐसा करता है, और उस रिपॉजिटरी को एक निर्भरता के रूप में इंजेक्ट किया जाता है। यह आसान मॉकिंग और सभी TDD-goodness जो आप चाहते हैं, के लिए अनुमति देता है। लेकिन अंत में आप यह सुनिश्चित करना चाहते हैं कि आपके रिपॉजिटरी अपने कर्तव्यों का पालन करें और अगर ऐसा करने का सबसे आसान तरीका एक डेटाबेस मारा जाता है, तो ठीक है, इसलिए ऐसा हो। मैंने लंबे समय से इस धारणा पर ध्यान दिया है कि 'यूनिट परीक्षणों को डेटाबेस को नहीं छूना चाहिए' और यह जान लिया कि ऐसा करने के बहुत वास्तविक कारण हैं। लेकिन केवल अगर आप यह स्वचालित रूप से और बार-बार कर सकते हैं। और मौसम को हम ऐसे परीक्षण को 'इकाई परीक्षण' या 'एकीकरण परीक्षण' कहते हैं।