2008-09-16 5 views
6

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

मुझे पता है कि मुझे शायद नकली वस्तुओं का उपयोग करना चाहिए, लेकिन इस मामले में मैं इसके बारे में वास्तव में कैसे जाऊं? मैं देख सकता हूं कि यह अपेक्षाकृत आसान है जब मुझे केवल पहले से मौजूद किसी ऑब्जेक्ट का संदर्भ देना होगा, लेकिन मेरे कुछ दिनचर्या बाहरी COM ऑब्जेक्ट्स को तुरंत चालू करते हैं और फिर कभी-कभी उन्हें किसी अन्य लाइब्रेरी से किसी अन्य बाहरी COM-ऑब्जेक्ट पर भेज देते हैं।

यहां सबसे अच्छा अभ्यास दृष्टिकोण क्या है? क्या मेरे पास मेरा परीक्षण कोड अस्थायी रूप से रजिस्ट्री में COM पंजीकरण जानकारी बदलना चाहिए ताकि परीक्षण कोड इसके बजाय मेरी नकली वस्तुओं में से एक को तुरंत चालू कर दे? क्या मुझे संशोधित प्रकार पुस्तकालय इकाइयों को इंजेक्ट करना चाहिए? वहां अन्य दृष्टिकोण क्या हैं?

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

धन्यवाद,

ओलिवर

उत्तर

6

के लिए एक अच्छा परिचय है। इस रैपर को आसानी से मजाक किया जा सकता है।

क्योंकि आपके पास सीधे COM ऑब्जेक्ट्स को तुरंत चालू करने के आपके कोड के कुछ हिस्सों हैं, यह वास्तव में फिट नहीं है। यदि आप उस कोड को बदल सकते हैं, तो आप फैक्ट्री पैटर्न का उपयोग कर सकते हैं: वे COM ऑब्जेक्ट बनाने के लिए फैक्ट्री का उपयोग करते हैं। आप वैकल्पिक वस्तुओं को वापस करने के लिए कारखाने का नकल कर सकते हैं।

चाहे ऑब्जेक्ट को रैपर के माध्यम से या मूल COM इंटरफ़ेस के माध्यम से एक्सेस किया गया हो, आप पर निर्भर है। यदि आप COM इंटरफ़ेस का नकल करना चुनते हैं, तो अपने मॉक में IU अज्ञात :: QueryInterface को याद रखें, ताकि आप जान सकें कि आपने सभी इंटरफेस का मज़ाक उड़ाया है, खासकर यदि ऑब्जेक्ट को किसी अन्य COM ऑब्जेक्ट में पास किया गया हो।

वैकल्पिक रूप से, CoTreateAsClass विधि देखें। मैंने कभी इसका इस्तेमाल नहीं किया है, लेकिन यह आपको जो चाहिए वह कर सकता है।

3

यह testability के लिए डिजाइन 'के लिए नीचे आता है। आदर्श रूप से, आपको उन COM ऑब्जेक्ट्स को तुरंत चालू नहीं करना चाहिए, लेकिन उन्हें एक संकेतक की परत के माध्यम से एक्सेस करना चाहिए जिसे एक नकली वस्तु द्वारा प्रतिस्थापित किया जा सकता है।

अब, COM स्वयं ही एक स्तर का संकेत प्रदान करता है और आप एक नकली वस्तु प्रदान कर सकते हैं जो वास्तविक व्यक्ति के लिए एक विकल्प प्रदान करता है लेकिन मुझे संदेह है कि यह एक दर्द होगा और मुझे संदेह होगा कि आपको इससे बहुत मदद मिलेगी एक मौजूदा मॉकिंग ढांचा।

+0

सहमत; और चूंकि COM ऑब्जेक्ट्स के साथ सभी इंटरैक्शन (आईडीस्पेच के माध्यम से ऑटोमेशन कॉल को छोड़कर) एक COM इंटरफ़ेस का उपयोग करता है, तो आपको केवल अपने मॉक क्लास में लागू करने में सक्षम होना चाहिए। – rpetrich

2

मैं आपकी तीसरी पार्टी COM ऑब्जेक्ट के चारों ओर एक पतली रैपर कक्षा लिखूंगा, जिसमें यूनिट परीक्षण स्थिति में वास्तविक COM ऑब्जेक्ट की बजाय नकली ऑब्जेक्ट लोड करने की क्षमता है। मैं आमतौर पर ऐसा दूसरा कन्स्ट्रक्टर रखता हूं जिसे मैं नकली ऑब्जेक्ट में गुजरता हूं। सामान्य कन्स्ट्रक्टर ने COM ऑब्जेक्ट को सामान्य के रूप में लोड किया होगा।

विकिपीडिया लेख परंपरागत दृष्टिकोण का कहना है कि अपने ग्राहक कोड एक आवरण है, जो COM वस्तु instantiating के लिए जिम्मेदार है का उपयोग करना चाहिए विषय Wikipedia artible

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

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