2008-09-19 13 views
5

आप रचना का उपयोग करते हैं, तो आप अन्य वस्तुओं जहाँ से अपनी कक्षा-अंडर-परीक्षण निर्भर करता है नकली कर सकते हैं, लेकिन जब आप विरासत का उपयोग करें, आप आधार वर्ग नकली नहीं कर सकते। (? या आप कर सकते हैं)मैं विरासत वस्तुओं को यूनिट-टेस्ट कैसे करूं?

मैं आम तौर पर prefer composition over inheritance, लेकिन कभी कभी विरासत करने की कोशिश वास्तव में इस काम के लिए सबसे अच्छा उपकरण की तरह लगता है - अच्छी तरह से, कम से कम जब तक यह इकाई परीक्षण के लिए आता है।

तो, आप विरासत का परीक्षण कैसे करते हैं? या आप इसे अवांछनीय के रूप में कचरा करते हैं और इसके बजाए संरचना का उपयोग करते हैं?

नोट: मैं ज्यादातर PHP और PHPUnit का उपयोग करें, ताकि पक्ष पर मदद सबसे की सराहना की है। लेकिन अगर अन्य भाषाओं में इस समस्या का समाधान हो तो जानना भी दिलचस्प होगा।

+0

एक [अच्छा उदाहरण] है (http://stackoverflow.com/questions/58969/best-way-to-unit-test-a-website-with-multiple-user-types-with-phpunit#63442) [[मुआवजा द्वारा दिए गए समाधान] के लिए [http://stackoverflow.com/questions/100795/how-do-i-unit-test-inheriting-objects#116340)। परीक्षण पदानुक्रम आपके वर्ग पदानुक्रम जैसा दिखने दें। – GrGr

+0

मुझे नहीं लगता कि सुपरक्लस का नकल करना कैसे संभव होगा। यह एक भाषा सुविधा ihmo होना होगा। आप वास्तव में परीक्षण करने की कोशिश कर रहे हैं? मेरे लिए ऐसा लगता है जैसे प्रतिबिंब आपके लिए सहायक हो सकता है? – Robse

+0

मुझे यह भी नहीं पता कि अभिभावक वर्ग का मज़ाक उड़ाया जा सकता है। यही कारण है कि मैं पूछ रहा हूँ। लेकिन मुझे नहीं लगता कि यह असंभव है - कंप्यूटर में बहुत कम चीजें हैं। –

उत्तर

4

जब तक आप माता-पिता वर्ग की जनता के तरीकों पर हावी नहीं है, मैं तुम क्यों यह सभी उपवर्गों पर उन्हें परीक्षण की आवश्यकता नहीं दिख रहा। यूनिट अभिभावक वर्ग पर विधियों का परीक्षण करता है, और केवल उपखंडों पर नई विधियों या अतिरंजित परीक्षणों का परीक्षण करता है।

1

आपको बेस क्लास का नकल क्यों करना चाहिए?

आप कैसे एक गैर-मौजूद जनक वर्ग से व्युत्पन्न वर्ग बना सकते हैं?

बस इसे सामान्य रूप से जांचें, लेकिन अभिभावक वर्ग रखें।

मुझे लगता है कि आपने पूरी कहानी नहीं बताया है।

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

3

रचना में नकली वस्तुओं का उपयोग करने का कारण यह है कि वास्तविक वस्तुएं ऐसी चीज करती हैं जो आप सेट अप नहीं करना चाहते हैं (जैसे सॉकेट, सीरियल पोर्ट्स, उपयोगकर्ता इनपुट प्राप्त करें, भारी डेटा पुनर्प्राप्त करें आदि)। जहां भी संभव हो, आपको हमेशा वास्तविक वस्तुओं का उपयोग करना चाहिए। नकली वस्तुएं केवल तब होती हैं जब वास्तविक वस्तु का उपयोग करके परीक्षण को कार्यान्वित करने और बनाए रखने का अनुमानित प्रयास एक नकली वस्तु का उपयोग करके परीक्षण को कार्यान्वित करने और बनाए रखने के लिए अधिक होता है। आपकी बेस क्लास उस तरह की कल्पना नहीं करनी चाहिए!

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

मूलतः

, (ज्यादातर समय) के रूप में अगर आधार वर्ग अदृश्य है आप एक व्युत्पन्न वर्ग का परीक्षण करें।

0

नहीं, आप नहीं करते हैं। आपको सिर्फ यह जांचना होगा कि ओवर्रिडन विधियों को वह करना चाहिए जो उन्हें करना चाहिए। यह किसी भी तरह से आपके माता-पिता के तरीकों के व्यवहार को प्रभावित नहीं करना चाहिए। यदि आपके माता-पिता के तरीके विफल होने लगते हैं, तो इसका मतलब है कि माता-पिता स्तर पर परीक्षण करते समय आप बाध्य स्थितियों को याद करते हैं।

+0

आप सही हैं, और यह वही है जो मैं भी इंगित कर रहा हूं! जब तक आप उप-वर्ग में एक विधि को ओवरराइड करते हैं, तब तक आपको इकाई का परीक्षण करना होगा। तथ्य यह है कि यह पैरेंट विधि को कॉल करता है या इससे कोई फर्क नहीं पड़ता, बस परीक्षण करें कि सबक्लास 'विधि का परिणाम वह है जिसे आप उम्मीद करते हैं, साथ ही मूल विधि जैसा व्यवहार आप चाहते हैं। इसके अलावा, जैसा कि @ मेटाओ ने इंगित किया है, आपके माता-पिता वर्ग में कोई अतिरिक्त राज्य सेट अप नहीं है जिसे आपने अपने उप-वर्ग में नहीं पकड़ा था। और यदि ऐसा होता है, तो आपको विरासत पर संरचना का उपयोग करके पुनर्विचार करना चाहिए। – gizmo

+0

मैं पूरी तरह से सहमत हूं कि subclass विधियों को नहीं होना चाहिए जिस तरह से मूल वर्ग विधियों का व्यवहार होता है। यही कारण है कि मेरे पास पेरेंट क्लास के सदस्य चर का उपयोग करने से बचा है और केवल सार्वजनिक इंटीफेस का उपयोग करता है। लेकिन जब उप-वर्ग विधि पैरेंट क्लास में विधि कॉल करती है, तो जब सबक्लास विधि का परीक्षण करता है तो मैं परीक्षण क्लासिक क्लास विधि को भी समाप्त करता हूं। –

5

उपयोग इकाई परीक्षण का एक सूट है कि वर्ग पदानुक्रम प्रतिबिंबित करता है। यदि आपके पास बेस क्लास बेस और व्युत्पन्न क्लास व्युत्पन्न है, तो टेस्ट क्लास बेसटेस्ट हैं और उस व्युत्पन्न टेस्ट से व्युत्पन्न हैं। बेसटेस्ट बेस में परिभाषित सब कुछ का परीक्षण करने के लिए ज़िम्मेदार है। DerivedTests उन परीक्षणों को विरासत में लेता है और व्युत्पन्न में सबकुछ का परीक्षण करने के लिए भी जिम्मेदार है।

यदि आप आधार में संरक्षित वर्चुअल विधियों का परीक्षण करना चाहते हैं (यानी बेस और उसके वंशज वर्गों के बीच इंटरफ़ेस) तो यह केवल उस इंटरफ़ेस का परीक्षण करने वाली टेस्ट-केवल व्युत्पन्न कक्षा बनाने का अर्थ हो सकता है।

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