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