2010-05-06 9 views
6

मैंने Beck द्वारा वर्णित "Replace Method with Method Object" रेफैक्टरिंग का प्रदर्शन किया है।मैं विधि ऑब्जेक्ट में विधियों का परीक्षण कैसे करूं?

अब, मेरे पास "रन()" विधि और सदस्य कार्यों का एक समूह है जो गणना को छोटे इकाइयों में विघटित करता है। मैं उन सदस्य कार्यों का परीक्षण कैसे करूं?

मेरा पहला विचार यह है कि मेरा यूनिट परीक्षण मूल रूप से "रन()" विधि (विभिन्न प्रारंभिकताओं के साथ) की प्रतियां हो सकता है, लेकिन गणना के राज्य की जांच करने के लिए प्रत्येक कॉल के बीच सदस्यों के कार्यों के बीच दावे के साथ।

(मैं अजगर और unittest मॉड्यूल का उपयोग कर रहा हूँ।)

class Train: 

    def __init__(self, options, points): 
     self._options = options 
     self._points = points 
     # other initializations 

    def run(self): 
     self._setup_mappings_dict() 
     self._setup_train_and_estimation_sets() 
     if self._options.estimate_method == 'per_class': 
      self._setup_priors() 
     self._estimate_all_mappings() 
     self._save_mappings() 

    def _estimate_all_mappings(): 
     # implementation, calls to methods in this class 

    #other method definitions 

मैं निश्चित रूप से क्या सदस्य विशेषताओं के राज्यों से पहले और के हिस्से के रूप अलग अलग तरीकों के लिए कॉल के बाद किया जाना चाहिए के बारे में उम्मीदें हैं run() विधि का कार्यान्वयन। क्या मुझे इन "निजी" विशेषताओं के बारे में दावा करना चाहिए? मुझे नहीं पता कि इन तरीकों को कैसे बेकार करना है।

दूसरा विकल्प यह है कि मुझे वास्तव में इनका परीक्षण नहीं करना चाहिए।

+0

कुछ प्रश्न या छद्म कोड आपके प्रश्न को समझने में सहायक होंगे। जो आपने लिखा है, उससे ऐसा लगता है कि आप unittest.TestCase.setUp() विधि से लाभ उठा सकते हैं। http://docs.python.org/library/unittest.html#unittest.TestCase.setUp – msw

+0

मैंने आपके प्रश्न को आपके द्वारा प्रदान किए गए कोड के साथ संपादित किया है। क्या आप इंडेंटेशन की जांच कर सकते हैं सही है, और यदि आवश्यक हो तो फिर से संपादित करें? –

+0

@ire_and_curses। धन्यवाद, थोड़ा संपादित किया। स्वयं जवाब के लिए –

उत्तर

10

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

+1

+1 और उस पर एक सुंदर अच्छा, अगर यह इकाई परीक्षण के लिए उपयुक्त नहीं है, तो शायद यह "इकाई" नहीं है। – msw

6

मुझे आपका जवाब पसंद है, लेकिन मैं असहमत हूं।

वह स्थिति जहां आप इस डिजाइन पैटर्न का उपयोग करेंगे, वह एक ऐसा जटिल परिचालन चल रहा है। नतीजतन इस तरह के एक ऑपरेशन के व्यक्तिगत घटकों को सत्यापित करने के लिए abel होने के नाते मैं कहूंगा कि अत्यधिक वांछनीय है।

तब आपके पास अन्य संसाधनों पर निर्भरता का मुद्दा है (जो इस मामले में सत्य हो सकता है या नहीं)।

कक्षा को अलग करने के लिए आपको कुछ प्रकार के नकली इंजेक्ट करने के लिए आईओसी के कुछ रूपों का उपयोग करने में सक्षम होना चाहिए।

अधिकांश मॉकिंग फ्रेमवर्क के अलावा आपको निजी सदस्यों को प्राप्त करने के लिए एक्सेसर्स प्रदान किए जाएंगे।

+0

इस वैकल्पिक दृश्य के लिए धन्यवाद। जब मैंने इस सवाल से पूछा तो मुझे वापस मज़ाक करने की जानकारी नहीं थी। –

+1

मैंने आपके दिमाग को भी आपके जैसे बदल दिया है। यदि आपको निजी परीक्षण करने की आवश्यकता है तो शायद इसे किसी अन्य वर्ग में ले जाया जाना चाहिए। हालांकि मुझे लगता है कि मेरा विचार अभी भी उन चीजों के लिए है जो आंतरिक होना चाहिए - निजी नहीं। –

संबंधित मुद्दे

 संबंधित मुद्दे