2016-05-06 5 views
6

मैं समझता हूं कि अगर कोड को संरचित किया गया है तो यह इंटरफेस के लिए प्रोग्राम किया गया है, यह नकली करने के लिए तुच्छ है; हालांकि, मैं एक कोड बेस के साथ काम कर रहा हूं जिसे मैं नहीं बदल सकता (यह मेरा नहीं है) और यह मामला नहीं है।गोलांग बंदर पैचिंग

यह कोड बेस भारी अंतःस्थापित है और कुछ भी इंटरफ़ेस के लिए प्रोग्राम नहीं किया गया है, केवल structs, इसलिए कोई निर्भरता इंजेक्शन नहीं है।

structs, स्वयं में केवल अन्य structs होते हैं, इसलिए मैं इस तरह से नकल नहीं कर सकता। मुझे विश्वास नहीं है कि मैं विधियों के बारे में कुछ भी कर सकता हूं, और मौजूद कुछ कार्य चर नहीं हैं, इसलिए कोई रास्ता नहीं है कि मैं उन्हें स्वैप करने के बारे में जानता हूं। गोलांग में विरासत एक चीज नहीं है, इसलिए यह कोई भी नहीं है।

पायथन जैसी पटकथा भाषाओं में, हम रनटाइम, उर्फ ​​बंदर पैच पर ऑब्जेक्ट्स को संशोधित कर सकते हैं। क्या कुछ तुलनात्मक है कि मैं गोलांग में कर सकता हूं? अंतर्निहित कोड को छूए बिना परीक्षण/बेंचमार्क करने के लिए कुछ तरीका जानने का प्रयास कर रहा है।

उत्तर

3

जब मैं इस स्थिति में भाग लेता हूं तो मेरा दृष्टिकोण एक आवरण के रूप में अपने स्वयं के इंटरफ़ेस का उपयोग करना है जो परीक्षणों में मजाक करने की अनुमति देता है। उदाहरण के लिए।

type MyInterface interface { 
    DoSomething(i int) error 
    DoSomethingElse() ([]int, error) 
} 

type Concrete struct { 
    client *somepackage.Client 
} 

func (c *Concrete) DoSomething(i int) error { 
    return c.client.DoSomething(i) 
} 

func (c *Concrete) DoSomethingElse() ([]int, error) { 
    return c.client.DoSomethingElse() 
} 

अब आप उसी तरह आप somepackage.Client नकली हैं अगर यह बहुत एक अंतरफलक थे में कंक्रीट नकली कर सकते हैं।

@elithrar द्वारा नीचे दी गई टिप्पणियों में उल्लिखित अनुसार, आप उस प्रकार को एम्बेड कर सकते हैं जिसे आप नकली करना चाहते हैं ताकि आपको केवल उन विधियों को जोड़ने के लिए मजबूर किया जा सके जिन्हें मॉकिंग की आवश्यकता है। उदाहरण के लिए:

type Concrete struct { 
    *somepackage.Client 
} 

जब ऐसा किया, DoSomethingNotNeedingMocking जैसे अतिरिक्त तरीकों/इंटरफ़ेस में जोड़ने के लिए इसे बाहर नकली बिना Concrete पर सीधे कहा जा सकता है।

+0

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

+0

कि, दुर्भाग्यपूर्ण यह हो सकता है, वही है जो मैं सुझाव दे रहा हूं। – sberry

+1

आपको उन विधियों को कॉल/मॉक करने की आवश्यकता नहीं है जिन्हें आपको ओवरराइड करने की आवश्यकता नहीं है। आप मूल प्रकार को अपने प्रकार के अंदर एम्बेड करते हैं, जो विधियों को बढ़ावा देता है, और फिर केवल उन तरीकों को ओवरराइड करता है जिन्हें आप चाहते हैं: https://play.golang.org/p/oHW1JX8iFb – elithrar

1

गो के लिए available monkey patching library है। यह केवल इंटेल/एएमडी सिस्टम (विशेष रूप से ओएसएक्स और उबंटू को लक्षित करना) के लिए काम करता है।

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