2009-10-12 11 views
12

विधियों के लिए सुविधा अधिभार बनाने के लिए मेरे लिए वास्तव में आम है।क्या मुझे सुविधा ओवरलोड के लिए परीक्षण डुप्लिकेट करना चाहिए?

public void Encode(string value) { 
    Encode(value, DefaultEncoding); 
} 

public void Encode(string value, Encoding encoding) { 
    // ... 
} 

मैं इकाई परीक्षण के लिए और अधिक ध्यान देने के लिए शुरू कर, और परीक्षण इस तरह के तरीकों कुछ बाधाओं मुझे यकीन है कि मुझे विश्वास अपने आप को अकेला दृष्टिकोण नहीं कर रहा हूँ प्रस्तुत करता है: यहाँ कुछ का एक उदाहरण मैं क्या कर सकता है। पहली और सबसे महत्वपूर्ण समस्या यह है कि क्या मुझे दोनों ओवरलोड के लिए परीक्षण डुप्लिकेट करना चाहिए। उदाहरण के लिए, दोनों विधियों को ArgumentNullException फेंकना चाहिए यदि मान शून्य है; क्या यह पहचानने के लिए और अधिक सही है अलग तर्क हो सकता है और दो परीक्षण लिख सकता है या यह मानना ​​बेहतर है कि सुविधा अधिभार के पास स्वयं का कोई तर्क नहीं है?

मुझे भी एक माध्यमिक समस्या मिली है। मेरी नामकरण योजना रॉय ओशरोव के समान है: "सदस्य नाम_स्टेट_एक्सपेक्ट रीसेट"। यदि मैं परीक्षणों को डुप्लिकेट करता हूं, तो मेरे पास कुछ oddball नामकरण सम्मेलन शुरू किए बिना नामों को झुकाव है। यदि आप परीक्षण डुप्लिकेट करते हैं तो आप इसे कैसे संभालेंगे?

उत्तर

1

मैं अक्सर उन मुख्य तरीकों के रूप में विस्तार विधियों का परीक्षण नहीं करता क्योंकि वे मूल विधि कहते हैं। उदाहरण के लिए आपका ArgumentNullException केस। मैं इसे दो बार परीक्षण नहीं करता। मेरी भावना यह है कि इकाई परीक्षण सफेद बॉक्स परीक्षण है। मुझे कार्यान्वयन जानने की अनुमति है।

बेशक इसका मतलब यह हो सकता है कि जब मैं जाता हूं और बाद में प्रतिक्रिया करता हूं और सुविधा विधि में कार्यक्षमता जोड़ता हूं तो मुझे जला दिया जा रहा है। लेकिन मैं टीडीडी करने में बहुत सभ्य हूं (पूर्ण अनुयायी नहीं जैसा कि आप पहले पैराग्राफ से बता सकते हैं)। इसलिए मुझे लगता है कि मैं उस नई कार्यक्षमता के लिए एक परीक्षा लिखूंगा और फिर इसे कवर करूँगा।

मैं दावा नहीं कर रहा हूं कि यह कम या ज्यादा सही है। यह वही है जो मैं करता हूं।

0

अपने सभी निर्माताओं पूरी तरह से निर्दिष्ट निर्माता कॉल करते हैं, मैं
1) अपने मौजूदा इकाई परीक्षण में परीक्षण टूट जाएगा, भार के लिए कुछ
ConstructorShouldDoThisAndThat()
2) जैसे विशेष इकाई परीक्षण किया जाना चाहिए जो , यह निर्दिष्ट क्या अधिभार का उपयोग करता है डिफ़ॉल्ट, ConstructorWithNoEncodingShouldSetEncodingToDefaultEncoding()

6

की तरह "दो परीक्षणों लिख सकते हैं या यह बेहतर माना कि सुविधा भार के अपने स्वयं के कोई तर्क है?"

उम्म .... आपके परीक्षण "धारणाओं" द्वारा परिभाषित नहीं हैं। वे आपके द्वारा परीक्षण की जा रही कक्षा के डिज़ाइन द्वारा परिभाषित किए गए हैं।

आप "धारणाओं" के आधार पर कुछ भी नहीं करते हैं।

सुविधा समारोह वास्तव में एक सुविधा समारोह है, तो यह चाहिए एक ही बात करते हैं और आपको एक परीक्षण दर्शाता है कि कि दोनों संस्करण तरीकों वास्तव में एक ही बात कर लिखना चाहिए।

हैं "वहाँ अलग तर्क हो सकता है" (1) यह वास्तव में एक सुविधा कार्य नहीं है और (2) आप एक परीक्षण दर्शाता है कि कि दोनों संस्करण तरीकों वास्तव में सही काम करते हैं लिखना चाहिए (जो अलग तर्क के साथ समान हो सकता है, या अलग हो सकता है, मैं सवाल से नहीं बता सकता।)

"MemberName_State_ExpectedResult। अगर मैं परीक्षण नकल, तो मैं टकरा नाम है"

मूर्ख स्थिरता प्रश्नों से बचें। यदि आपके पास अलग-अलग हस्ताक्षरों के साथ एक ही विधि है, तो यह नामकरण सम्मेलन बहुत अच्छा नहीं है, है ना? ईमानदारी से चिपके हुए, इसकी समस्याओं के बावजूद, एक मूर्खतापूर्ण स्थिरता है।

आप तुच्छता से इस का उपयोग नहीं कर सकते हैं तरीकों कि केवल तर्क हस्ताक्षर से की जाती है जब। तो बस कुछ ऐसा करें जो आपके सभी सुविधा कार्यों के लिए काम करता है।

+0

दोनों खातों पर +1। सुविधा विधि के व्यवहार को सत्यापित करने के एक सरल तरीके के लिए, इस प्रश्न का मेरा उत्तर देखें। –

1

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

यह के बारे में 15 सेकंड के लिए ले एक परीक्षण है कि एक है कि यह overloads साथ अतिभारित फ़ंक्शन के परिणाम तुलना में लिखने के लिए करना चाहिए। ऐसा करो और आगे बढ़ो।

2

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

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

मैं दूसरे नामकरण परंपरा के बारे में S.Lott का जवाब।

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

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