क्या किसी तीसरे पक्ष के कोड को अपने उपभोक्ताओं के लिए इकाई परीक्षण का एकमात्र समाधान है?


13

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

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

अब मेरी कक्षा पर एक नज़र डालें Loggerजो निर्भर करता है Zend_Mail:

class Logger{
    private $mailer;    
    function __construct(Zend_Mail $mail){
        $this->mail=$mail;
    }    
   function toBeTestedFunction(){
      //Some code
      $this->mail->setTo('some value');
      $this->mail->setSubject('some value');
      $this->mail->setBody('some value');
      $this->mail->send();
     //Some
   }        
}

हालांकि, यूनिट परीक्षण की मांग है कि मैं एक समय में एक घटक का परीक्षण करता हूं, इसलिए मुझे Zend_Mailकक्षा का मजाक बनाने की आवश्यकता है । इसके अलावा मैं डिपेंडेंसी इनवर्जन सिद्धांत का उल्लंघन कर रहा हूं क्योंकि मेरी Loggerक्लास अब कंसट्रक्शन पर निर्भर करती है न कि एब्स्ट्रक्शन पर।

अब मैं कैसे परीक्षण कर सकते हैं Loggerरैपिंग बिना अलगाव में Zend_Mail?!

कोड PHP में है, लेकिन उत्तर होना जरूरी नहीं है। यह एक भाषा विशिष्ट विशेषता की तुलना में एक डिजाइन का मुद्दा है


क्या आपको एक इंटरफ़ेस का उपयोग करना है? क्या PHP समर्थन डकार टाइपिंग नहीं करता है?
केविन क्लाइन

@kevincline अच्छी तरह से मैं PHP इस्तेमाल किया है क्योंकि यह भाषा है कि मैं सबसे अधिक उपयोग है, लेकिन मैं वास्तव में समस्या के लिए एक सामान्य समाधान पीएचपी केवल तक ही सीमित नहीं रहा हूँ।
सांगो

जवाबों:


21

आप हमेशा एक इंटरफ़ेस के पीछे तीसरे पक्ष के प्रकार और विधियों को लपेटना चाहते हैं। यह थकाऊ और दर्दनाक हो सकता है। कभी-कभी आप एक कोड जनरेटर लिख सकते हैं या ऐसा करने के लिए एक उपकरण का उपयोग कर सकते हैं।

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

तीसरे पक्ष के विक्रेताओं को जल्दी से बदलने की क्षमता एक बड़ा लाभ है।


4
"आपके द्वारा लिखी गई कोई भी बात" थोड़ी बहुत नहीं है। पुस्तकालय जो मानक या मंच का हिस्सा हैं, उन्हें लपेटना मुश्किल है। उदाहरण के लिए, आप शायद सभी .NET घटकों को लपेटना नहीं चाहेंगे। यदि रैपर केवल इंटरफेस से गुजरते हैं, या कोड उत्पन्न होते हैं, तो मुझे परीक्षण लिखने के लिए बहुत कम लाभ मिला है। अगर वहां तर्क है (कॉल्स, आदि को मिलाकर) परीक्षण मददगार हो सकते हैं।
बेन

3
अंतिम वाक्य के लिए अपग्रेड किया गया।
Blrfl

1
यदि आप ठीक से रिफ्लेक्टर करते हैं, तो लाइब्रेरी सुविधाओं के किसी भी दोहराए जाने वाले उपयोग को सेवा वर्ग में शामिल किया जाएगा। इसे सामने परिभाषित करने की आवश्यकता नहीं है।
केविन क्लाइन

3
-1: ऐसे मामलों को छोड़कर, जहां थर्ड पार्टी लाइब्रेरी एक सेवा प्रदान करती है, जिसके लिए एक मानकीकृत एपीआई है, यह समय की भारी बर्बादी है और आपको केवल डुप्लिकेट कोड होने से ही स्थिरता में कमी आती है। इसके अलावा, YAGNI।
माइकल बोर्गवर्ड

1
@MichaelBorgwardt: ज़रूर, लेकिन उस स्थिति में, मानक एपीआई आवरण बन जाता है और आप पुस्तकालयों को आसानी से स्वैप कर सकते हैं।
ब्लरफ्ल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.