दिलचस्प पोस्ट
एंड्रॉइड में वैश्विक असंतुलित अपवाद हैंडलर सेट करने का आदर्श तरीका व्यूपोर्ट आईओएस 10 + सफारी ज़ूमिंग अक्षम करें? एंड्रॉइड लंबित इंस्टेंट क्या है? जावा प्रोग्राम को एक और जावा प्रोग्राम में कैसे संकलित और चलाने के लिए? .on ('click') बनाम vs.click () के बीच अंतर। एक्सटेंशन के तरीके क्या हैं? कॉलबैक फ़ंक्शन में c ++ ट्विटर एप्लिकेशन के लिए एंड्रॉइड इन्टेंट कैसे एक जावास्क्रिप्ट में अपने मूल्यों के द्वारा एक साहचर्य सरणी सॉर्ट करने के लिए? दो एनएसडीट की तुलना कैसे करें: कौन सा हाल ही में है? जावा हॅशमैप: कैसे मूल्य से कुंजी प्राप्त करने के लिए? जावा का स्ट्रिंग निरंतर पूल कहाँ रहते हैं, ढेर या ढेर? एक आइफ्रेम प्रतिक्रियाशील बनाना एक डमी-चर उत्पन्न करें के लिए "अस्थायी asp.NET फ़ाइलें" फ़ोल्डर क्या है?

इकाई परीक्षण शून्य तरीकों?

इकाई का सबसे अच्छा तरीका क्या तरीका है जो कुछ भी वापस नहीं लौटाता है? विशेष रूप से सी # में

जो मैं वास्तव में परीक्षण करने का प्रयास कर रहा हूं वह एक विधि है जो लॉग फ़ाइल लेती है और विशिष्ट स्ट्रिंग के लिए इसे पार्स करती है। तार तब एक डेटाबेस में डाला जाता है ऐसा कुछ नहीं जो पहले नहीं किया गया है, लेकिन टीडीडी के लिए बहुत नया है, मैं सोच रहा हूं कि यह जांचना संभव है या यह ऐसा कुछ है जो वास्तव में जांच नहीं करता है।

वेब के समाधान से एकत्रित समाधान "इकाई परीक्षण शून्य तरीकों?"

यदि कोई तरीका कुछ भी वापस नहीं करता है, तो यह निम्न में से एक है

  • अनिवार्य – आप ऑब्जेक्ट को खुद से कुछ करने के लिए कह रहे हैं .. जैसे कि राज्य को बदलना (बिना किसी पुष्टि की उम्मीद के लिए) .. यह मान लिया गया कि यह किया जाएगा)
  • सूचनात्मक – किसी को घटित करने के लिए, जो कुछ हुआ (कार्रवाई या प्रतिक्रिया की उम्मीद के बिना) क्रमशः

आज्ञाकारी तरीके – आप यह सत्यापित कर सकते हैं कि कार्य वास्तव में किया गया था। सत्यापित करें कि यदि राज्य परिवर्तन वास्तव में हुआ था। जैसे

void DeductFromBalance( dAmount ) 

यह सत्यापित करके परीक्षण किया जा सकता है कि यदि यह संदेश शेष राशि वास्तव में डीएएमए द्वारा आरंभिक मूल्य से कम है

सूचनात्मक पद्धति – ऑब्जेक्ट के सार्वजनिक इंटरफ़ेस के सदस्य के रूप में दुर्लभ हैं … इसलिए सामान्य रूप से यूनिट परीक्षण नहीं किया गया। हालांकि, यदि आपको चाहिए, तो आप यह सत्यापित कर सकते हैं कि एक अधिसूचना पर किया जाने वाला हेडिंग कब होता है। जैसे

 void OnAccountDebit( dAmount ) // emails account holder with info 

अगर ईमेल भेजा जा रहा है तो यह सत्यापित करके परीक्षण किया जा सकता है

अपनी वास्तविक पद्धति के बारे में अधिक विवरण पोस्ट करें और लोग बेहतर जवाब देने में सक्षम होंगे।
अद्यतन : आपकी विधि 2 चीजें कर रही है मैं वास्तव में इसे दो विधियों में बांट दूंगा जो अब स्वतंत्र रूप से परीक्षण किया जा सकता है

 string[] ExamineLogFileForX( string sFileName ); void InsertStringsIntoDatabase( string[] ); 

स्ट्रिंग [] आसानी से एक डमी फ़ाइल और उम्मीद की तार के साथ पहली विधि प्रदान करके सत्यापित किया जा सकता है। दूसरा एक थोड़ा मुश्किल है .. आप या तो डीबी की नकल करने के लिए या नकली (चौंकाने वाले चौखटे पर Google या खोज स्टैक ओवरफ्लो) का उपयोग कर सकते हैं या वास्तविक डीबी को दबा सकते हैं और यह सत्यापित कर सकते हैं कि तार सही स्थान पर डाले गए थे या नहीं। कुछ अच्छे पुस्तकों के लिए इस धागा की जांच करें … यदि आप एक संकट में हैं तो मैं व्यावहारिक यूनिट परीक्षण की सिफारिश करूँगा।
कोड में इसे इस्तेमाल किया जाएगा जैसे

 InsertStringsIntoDatabase( ExamineLogFileForX( "c:\OMG.log" ) ); 

इसकी दुष्प्रभावों का परीक्षण करें यह भी शामिल है:

  • क्या यह किसी भी अपवाद फेंक? (यदि यह होना चाहिए, तो यह जांचें कि यदि ऐसा होता है, तो ऐसा नहीं कर सकते हैं। कुछ कोने के मामलों की कोशिश करें, जो शायद आप सावधान न हों – शून्य तर्कें सबसे स्पष्ट चीज हैं।
  • क्या यह अपने मानकों के साथ अच्छी तरह खेलते हैं? (यदि वे अस्थिर हो, तो क्या उन्हें इन्हें बदलना पड़ता है जब यह ठीक नहीं होता?)
  • क्या उस वस्तु / प्रकार की स्थिति पर सही प्रभाव पड़ता है जिसे आप इसे बुला रहे हैं?

बेशक, आप कितना परीक्षण कर सकते हैं की एक सीमा है। आप आम तौर पर हर संभव इनपुट के साथ परीक्षण नहीं कर सकते, उदाहरण के लिए। व्यावहारिक रूप से परीक्षा – आपको विश्वास है कि आपके कोड को उचित तरीके से तैयार किया गया है और सही ढंग से कार्यान्वित किया गया है, और कॉलर की अपेक्षा के लिए पूरक दस्तावेज़ के रूप में कार्य करने के लिए पर्याप्त है।

हमेशा की तरह: जांच करें कि विधि क्या करने वाली है!

क्या यह वैश्विक राज्य बदल जाएगा (उह, कोड गंध!) कहीं?

क्या यह एक अंतरफलक में कॉल करे?

गलत पैरामीटर के साथ बुलाए जाने पर क्या इसे अपवाद फेंकना चाहिए?

सही मापदंडों के साथ बुलाए जाने पर क्या कोई अपवाद फेंकना चाहिए?

इसे होना चाहिए …?

शून्य वापसी प्रकार / उप-रूटियां पुरानी खबरें हैं मैंने 8 साल की तरह शून्य वापसी प्रकार (जब तक मैं बेहद आलसी नहीं हो रहा) नहीं बनाया है (इस उत्तर के समय से, इस सवाल से पहले थोड़ा सा सवाल पूछा गया था)।

इसके बजाय एक विधि की तरह:

 public void SendEmailToCustomer() 

माइक्रोसॉफ्ट के int.TryParse () प्रतिमान के बाद एक विधि बनाओ:

 public bool TrySendEmailToCustomer() 

हो सकता है कि कोई भी जानकारी आपके विधि को लंबे समय तक उपयोग के लिए लौटने की ज़रूरत नहीं है, लेकिन इसे अपना काम करने के बाद विधि की स्थिति लौटाने वाला कॉलर के लिए बहुत बड़ा उपयोग है।

इसके अलावा, bool केवल राज्य प्रकार नहीं है कई बार ऐसे समय होते हैं जब पूर्व-निर्मित सरोराइन वास्तव में तीन या दो अलग-अलग राज्यों (अच्छा, सामान्य, बुरा, आदि) वापस कर सकता था। उन मामलों में, आप केवल उपयोग करेंगे

 public StateEnum TrySendEmailToCustomer() 

हालांकि, जबकि कोशिश-प्रतिमान कुछ हद तक इस प्रश्न का उत्तर देता है कि कैसे शून्य वापसी का परीक्षण किया जाए, तो अन्य विचार भी हैं उदाहरण के लिए, "टीडीडी" चक्र के दौरान / बाद में, आप "रिफैक्टरिंग" होंगे और नोटिस करेंगे कि आप अपनी विधि के साथ दो चीजें कर रहे हैं … इस प्रकार "एकल दायित्व सिद्धांत" को तोड़ते हैं। ताकि पहले की देखभाल करनी चाहिए दूसरा, हो सकता है कि आप एक निर्भरता को जन्म दे सकें … आप "पर्सिस्टेंट" डेटा को छू रहे हैं

यदि आप पद्धति-में-प्रश्न में डेटा एक्सेस सामग्री कर रहे हैं, तो आपको एक n-tier'd या n-layer'd वास्तुकला में पुन: करने की आवश्यकता है। लेकिन हम यह मान सकते हैं कि जब आप कहते हैं "स्ट्रिंग्स को एक डाटाबेस में डाला जाता है", तो आप वास्तव में मतलब है कि आप एक व्यावसायिक तर्क स्तर या कुछ कह रहे हैं हां, हम मान लेंगे कि।

जब आपका ऑब्जेक्ट तत्काल होता है, अब आप समझते हैं कि आपके ऑब्जेक्ट की निर्भरताएं हैं यह तब होता है जब आप यह तय करने की आवश्यकता है कि आप ऑब्जेक्ट, या विधि पर निर्भरता इंजेक्शन करने जा रहे हैं। इसका अर्थ है कि आपका कन्स्ट्रक्टर या विधि-में-प्रश्न को एक नया पैरामीटर की आवश्यकता है:

 public <Constructor/MethodName> (IBusinessDataEtc otherLayerOrTierObject, string[] stuffToInsert) 

अब जब आप अपने व्यापार / डेटा स्तरीय ऑब्जेक्ट के इंटरफ़ेस को स्वीकार कर सकते हैं, तो आप इसे यूनिट टेस्ट के दौरान नकली कर सकते हैं और इसमें कोई निर्भरता नहीं है या "दुर्घटना" के एकीकरण परीक्षण का डर नहीं है।

तो आपके लाइव कोड में, आप एक असली IBusinessDataEtc ऑब्जेक्ट पास करते हैं। लेकिन आपकी इकाई परीक्षण में, आप एक IBusinessDataEtc ऑब्जेक्ट में पास करते हैं। उस नकली में, आप गैर-इंटरफ़ेस गुणों जैसे int XMethodWasCalledCount या कुछ ऐसी int XMethodWasCalledCount शामिल कर सकते हैं जिनके राज्य (ओं) को अपडेट किया जाता है जब इंटरफ़ेस विधियों को कहा जाता है।

तो आपका यूनिट टेस्ट आपकी पद्धति (इनके) के जरिए -इन- IBusinessDataEtc , जो भी तर्क हो सकते हैं, और एक या दो, या आपके IBusinessDataEtc ऑब्जेक्ट में चयनित विधियों के लिए कॉल करें। जब आप अपने यूनिट टेस्ट के अंत में अपनी निंदा करते हैं तो आपके पास अब परीक्षण करने के लिए कुछ चीजें हैं

  1. "सबरुउटिन" का राज्य, जो अब एक प्रयास-प्रतिमान विधि है
  2. आपकी मॉक IBusinessDataEtc ऑब्जेक्ट स्टेट

निर्माण-स्तर पर निर्भरता इंजेक्शन विचारों के बारे में अधिक जानकारी के लिए … क्योंकि वे यूनिट परीक्षण से संबंधित हैं … बिल्डर डिजाइन पैटर्नों पर गौर करें यह आपके पास प्रत्येक वर्तमान इंटरफ़ेस / कक्षा के लिए एक और इंटरफ़ेस और वर्ग जोड़ता है, लेकिन वे बहुत छोटे हैं और बेहतर इकाई परीक्षण के लिए बड़ी कार्यक्षमता बढ़ जाती है।

इसका उद्देश्य किसी वस्तु पर कुछ प्रभाव पड़ता है …. प्रभाव के परिणाम के लिए क्वेरी। अगर इसकी कोई प्रभाव नहीं है, तो इसके लायक यूनिट परीक्षण नहीं है!

संभवत: विधि कुछ करती है, और बस वापस नहीं आती?

मान लें कि यह मामला है, फिर:

  1. यदि यह उसके मालिक की अवस्था को संशोधित करता है, तो आपको यह जांचना चाहिए कि राज्य सही ढंग से बदल गया है।
  2. यदि यह किसी ऑब्जेक्ट को पैरामीटर के रूप में लेता है और उस ऑब्जेक्ट को संशोधित करता है, तो ऑब्जेक्ट को सही ढंग से संशोधित किया जाना चाहिए।
  3. यदि यह अपवाद फेंकता है तो कुछ मामलों में, यह परीक्षण करें कि उन अपवादों को ठीक से फेंक दिया गया है
  4. यदि इसका व्यवहार अपने स्वयं के ऑब्जेक्ट, या कुछ अन्य ऑब्जेक्ट की स्थिति के आधार पर बदलता है, तो राज्य को प्रीसेट करें और इस पद्धति की जांच करें कि ऊपर के तीन परीक्षण विधियों में से एक सही है)।

यदि आप हमें यह बताते हैं कि विधि क्या करती है, तो मैं और अधिक विशिष्ट हो सकता हूं।

सेट करने के लिए राइनो मोक्स का उपयोग करें, कॉल, क्रियाएं और अपवादों की अपेक्षा की जा सकती है। यह मानते हुए कि आप अपनी विधि के कुछ हिस्सों का नकली या ठूंठ कर सकते हैं। विधि, या संदर्भ के बारे में यहाँ कुछ विशेषताओं को जानने के बिना जानने के लिए मुश्किल।

यह क्या कर रहा है पर निर्भर करता है। अगर इसमें मापदंड हैं, तो आप को बाद में पूछ सकते हैं कि वे मापदंडों के सही सेट के साथ बुलाए गए हैं।

इसे इस्तेमाल करे:

 [TestMethod] public void TestSomething() { try { YourMethodCall(); Assert.IsTrue(true); } catch { Assert.IsTrue(false); } } 

आपको यह भी जांचना चाहिए कि विधि एक अपवाद फेंकता है या नहीं।

क्या कभी उदाहरण आप शून्य विधि को कॉल करने के लिए उपयोग कर रहे हैं, आप केवल उपयोग कर सकते हैं, Verfiy

उदाहरण के लिए:

मेरे मामले में इसका _Log उदाहरण है और LogMessage की LogMessage की जाने वाली विधि है:

 try { this._log.Verify(x => x.LogMessage(Logger.WillisLogLevel.Info, Logger.WillisLogger.Usage, "Created the Student with name as"), "Failure"); } Catch { Assert.IsFalse(ex is Moq.MockException); } 

क्या Verify विफल हो जाएगा विधि की विफलता के कारण Verify एक अपवाद फेंकता है?