इस पोस्ट पर necro के लिए खेद है, लेकिन मुझे लगता है कि कुछ चीजों पर वजन करने के लिए मजबूर किया गया है जो ऐसा नहीं लगता है कि इसे स्पर्श किया गया है।
सबसे पहले - जब हम इकाई परीक्षण के दौरान एक कक्षा में निजी सदस्यों के लिए खुद की जरूरत महसूस करते हैं, तो यह आम तौर पर एक बड़ा, मोटा लाल झंडा होता है जिसे हमने अपने रणनीतिक या सामरिक दृष्टिकोण में जाना है और अनजाने में धक्का देकर एकल जिम्मेदारी वाले प्रिंसिपल का उल्लंघन किया है व्यवहार जहां यह नहीं है। उन तरीकों तक पहुंचने की आवश्यकता महसूस करना जो वास्तव में एक निर्माण प्रक्रिया के एक अलग-थलग सबरूटीन से ज्यादा कुछ नहीं हैं, यह सबसे आम घटनाओं में से एक है; हालाँकि, यह आपके बॉस की तरह है जो आपसे काम के लिए तैयार रहने की उम्मीद करता है और आपको यह जानने की भी ज़रूरत होती है कि सुबह की दिनचर्या आपको किस अवस्था में ले जाती है ...
ऐसा होने का दूसरा सबसे आम उदाहरण है जब आप खुद को लौकिक "देव वर्ग" का परीक्षण करने की कोशिश करते हुए पाते हैं। यह अपने आप में एक विशेष प्रकार की समस्या है, लेकिन एक प्रक्रिया के अंतरंग विवरणों को जानने की आवश्यकता के साथ एक ही मूल मुद्दे से ग्रस्त है - लेकिन यह विषय बंद हो रहा है।
इस विशिष्ट उदाहरण में, हमने प्रभावी रूप से बार ऑब्जेक्ट को FooBar क्लास के कंस्ट्रक्टर के लिए प्रारंभिक रूप से आरम्भ करने की जिम्मेदारी सौंपी है। ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में, कोर टेंट में से एक यह है कि कंस्ट्रक्टर "पवित्र" है और इसे अमान्य डेटा के खिलाफ संरक्षित किया जाना चाहिए जो अपने स्वयं के आंतरिक स्थिति को अमान्य कर देगा और इसे डाउनस्ट्रीम में कहीं और विफल करने के लिए प्राइमेड छोड़ देगा (क्या बहुत गहरा हो सकता है पाइप लाइन।)
हम यहां ऐसा करने में विफल रहे हैं कि FooBar ऑब्जेक्ट को एक बार स्वीकार करने के लिए अनुमति देता है जो कि FooBar के निर्माण के समय तैयार नहीं है, और मामलों को अपने आप में लेने के लिए FooBar ऑब्जेक्ट को "हैकिंग" के द्वारा मुआवजा दिया है। हाथ।
यह ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (बार के मामले में) के एक और दसवें हिस्से का पालन करने में विफलता का परिणाम है, जो यह है कि किसी वस्तु की स्थिति को पूरी तरह से प्रारंभिक किया जाना चाहिए और निर्माण के तुरंत बाद अपने 'सार्वजनिक सदस्यों के लिए किसी भी आने वाली कॉल को संभालने के लिए तैयार होना चाहिए। अब, इसका मतलब यह नहीं है कि निर्माणकर्ता को सभी उदाहरणों में बुलाया जाता है। जब आपके पास एक ऐसी वस्तु होती है जिसमें कई जटिल निर्माण परिदृश्य होते हैं, तो अपने वैकल्पिक सदस्यों को किसी ऐसी वस्तु के लिए व्यवस्थित करना बेहतर होता है जो किसी रचना डिज़ाइन-पैटर्न (फैक्टरी, बिल्डर, आदि ...) के अनुसार लागू की जाती है। उत्तरार्द्ध मामले,
आपके उदाहरण में, बार की "स्थिति" संपत्ति एक वैध स्थिति में नहीं लगती है जिसमें एक FooBar इसे स्वीकार कर सकता है - इसलिए FooBar उस मुद्दे को सही करने के लिए कुछ करता है।
दूसरा मुद्दा जो मैं देख रहा हूं वह यह है कि ऐसा प्रतीत होता है कि आप अभ्यास परीक्षण-संचालित विकास के बजाय अपने कोड का परीक्षण करने की कोशिश कर रहे हैं। निश्चित रूप से इस समय मेरी अपनी राय है; लेकिन, इस प्रकार का परीक्षण वास्तव में एक विरोधी पैटर्न है। आप जो कर रहे हैं वह यह महसूस करने के फंदे में पड़ रहा है कि आपको कोर डिज़ाइन की समस्याएं हैं जो आपके कोड को इस तथ्य के बाद परीक्षण करने से रोकती हैं, न कि आपके द्वारा आवश्यक परीक्षणों को लिखने और बाद में परीक्षणों को प्रोग्रामिंग करने के बजाय। किसी भी तरह से आप समस्या पर आते हैं, आपको अभी भी एक ही संख्या के परीक्षणों और कोड की पंक्तियों के साथ समाप्त करना चाहिए जो आपने वास्तव में एक ठोस कार्यान्वयन प्राप्त किया था। इसलिए - जब आप अपने विकास के प्रयासों की शुरुआत में केवल मामले को संबोधित कर सकते हैं, तो परीक्षण योग्य कोड में अपने तरीके से रिवर्स इंजीनियर की कोशिश क्यों करें?
अगर आपने ऐसा किया होता, तो आपको बहुत पहले ही इस बात का अहसास हो जाता था कि आपको अपने डिजाइन के खिलाफ परीक्षण करने के लिए कुछ बल्कि icky कोड लिखना होगा और कार्यान्वयन के लिए व्यवहार को शिफ्ट करके अपने दृष्टिकोण को फिर से शुरू करने का अवसर होगा आसानी से परीक्षण करने योग्य हैं।