2010-08-19 17 views
5

(सी #, WCF सेवा, राइनो Mocks, MbUNit)मजाक

मैं पहले से ही जगह में कोड के लिए परीक्षण लेखन किया गया है (हाँ मैं अपने गलत रास्ते के आसपास है, लेकिन है कि कैसे अपने अपने मौजूदा अनुबंध पर बाहर काम किया है)। मैंने मॉकिंग का समर्थन करने के लिए काफी पुन: फैक्टरिंग किया है - निर्भरता इंजेक्शन, अतिरिक्त इंटरफेस आदि जोड़ना - जिनमें से सभी ने डिजाइन में सुधार किया है। आम तौर पर मेरा परीक्षण अनुभव अच्छी तरह से चल रहा है (नाजुकता का खुलासा और decoupling में सुधार)। किसी भी वस्तु के लिए मैं आश्रित मॉक्स बना रहा हूं और यह मेरे साथ अच्छी तरह से बैठता है और समझ में आता है।

ऐप में अनिवार्य रूप से 4 भौतिक परतें हैं। डाटाबेस, डाटा एक्सेस के लिए एक रिपोजिटरी लेयर, एक डब्ल्यूसीएफ सेवा जो प्रबंधन (या व्यापार तर्क) परत के माध्यम से भंडार से जुड़ा हुआ है, तो शीर्ष पर यह ऐसा दिखता है;

WCF प्रबंधक भंडार डाटाबेस

परीक्षण प्रबंधकों और भंडार परत काफी सरल कर दिया गया है, राइनो Mocks साथ निर्भरता मजाक और जैसे परीक्षण के अंतर्गत परत में उन्हें इंजेक्शन।

मेरी समस्या शीर्ष डब्ल्यूसीएफ परत का परीक्षण करने में है। के रूप में मेरी सेवा निर्माता मुझे निर्भरता इंजेक्षन अनुमति देने के लिए नहीं है, मुझे यकीन है कि कैसे मैं जब सेवा पर सार्वजनिक विधियों (ServiceContracts) परीक्षण निर्भरता मजाक के बारे में जाना नहीं हूँ।

मुझे उम्मीद है कि यह समझ में आया है और किसी भी मदद की सराहना की है। मैं TypeMockIsolator इत्यादि से अवगत हूं, लेकिन वास्तव में बजट और अन्य कारणों के लिए उस मार्ग को नीचे नहीं जाना चाहता हूं, मैं यहां नहीं जाऊंगा। इसके अलावा मुझे यकीन है कि बहुत सारे चालाक 'स्टैकर्स' हैं जिनके पास मुझे आवश्यक जानकारी है।

अग्रिम धन्यवाद।

उत्तर

2

वहाँ एक विशेष कारण आप नहीं कर सकते आपकी सेवा पर एक निर्माता है है -

कैसे RhinoMock और विंडसर के साथ यह करने के लिए पर एक अच्छा ट्यूटोरियल के लिए, इस ब्लॉग लेख पर एक नज़र डालें? एक डिफ़ॉल्ट निर्माता तारों अप चूक और अपने निर्भरता के साथ एक parametrized निर्माता के साथ

यदि नहीं, तो आप अतिभारित हो सकता है कंस्ट्रक्टर्स। अब आप parametrized ctor का परीक्षण कर सकते हैं और उत्पादन में उदाहरण बनाने के लिए डिफ़ॉल्ट ctor पर भरोसा कर सकते हैं।

public MyService() : this(new DefaultDep1(), new DefaultDep2()) 
{ 
} 

public MyService(IDep1 d1, IDep2 d2) 
{ 
} 

एक बेहतर समाधान अगर आप निर्भरता इंजेक्शन का उपयोग WCF IInstanceProvider interface उपयोग करने के लिए है कि इंजेक्शन बिंदु के माध्यम से आपकी सेवा उदाहरण बना सकते हैं और जरूरत निर्भरता प्रदान करने के लिए किया जाएगा। संरचना मानचित्र का उपयोग कर एक उदाहरण here पाया जा सकता है।

+0

धन्यवाद कि जिस मार्ग को मुझे नीचे जाने की आवश्यकता है, वह ध्वनि है। लिंक के लिए धन्यवाद .. बहुत उपयोगी है। –

+0

आपकी मदद के लिए सभी धन्यवाद। जबकि कुछ जवाब समान थे .. इसे एक के रूप में चुना गया क्योंकि यह संक्षिप्त था और समस्या का सीधा समाधान इंगित करता है। फिर से धन्यवाद। –

0

आप WCF 'प्रबंधकों' पर एक पतली परत सेवाओं बना सकता है, तो वे कम या उन्हें में कोई तर्क जो परीक्षण की जरूरत है। फिर उनका परीक्षण न करें और केवल प्रबंधकों का परीक्षण करें। वैकल्पिक रूप से, आप एक और 'सेवा' परत कि कौन सी सेवा है, जो परीक्षण किया जा सकता से तर्क शामिल होने से एक समान प्रभाव को प्राप्त, और वास्तविक WCF कोड सिर्फ इतना है कि करने के लिए के माध्यम से पारित कर सकते हैं।

+0

ठीक है .. इसके लिए धन्यवाद .. मैंने कुछ ऐसा करने पर विचार किया था लेकिन एक परत शुरू करने से बचने की कोशिश कर रहा था। लेकिन यह एक संभावना के रूप में पुष्टि करने के लिए अच्छा है। –

0

हमारे WCF सेवा एक फैक्टरी वस्तु से अपने सभी निर्भरता हो जाता है, और हम सेवा एक निर्माता जो IFactory लेता दे। इसलिए यदि हम एक परीक्षा लिखना चाहते हैं जो निर्भरताओं में से एक को झुकाता है, तो एक निर्भरता कहें, हमें केवल एक नकली फैक्ट्री इंजेक्ट करने की आवश्यकता है, जिसे सेवा पर वापस मैकड निर्भरता ऑब्जेक्ट देने के लिए प्रोग्राम किया गया है।

+0

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

+0

हाँ, मैं यह नहीं कह रहा हूं कि यह बहुत अच्छा है, यह वही है जो हम उपयोग करते हैं और यह ठीक काम करता है। –

+0

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

0

यदि आप यूनिटी, ऑटोफैक या कैसल विंडसर, और एक मॉकिंग फ्रेमवर्क (जैसे मोक, एनएमॉक, राइनोमोक्स) जैसे नियंत्रण में बदलाव (आईओसी) का उपयोग करते हैं, तो यह तब तक आसान है जब तक आपके पास सही डिज़ाइन न हो। http://ayende.com/Blog/archive/2007/02/10/WCF-Mocking-and-IoC-Oh-MY.aspx

+0

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

0

यदि आप Castle Windsor का उपयोग कर रहे हैं, तो WCF facility पर एक नज़र डालें, यह आपको गैर-डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग करने और अन्य सेवाओं के साथ आपकी सेवाओं में निर्भरता इंजेक्ट करने देता है।

+0

मैं नहीं हूं .. लेकिन मुझे लगता है कि मुझे यह महसूस हो रहा है :)। पारितोषिक के लिए धन्यवाद। –

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