2009-01-06 9 views
8

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

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

मैक्स के कार्यान्वयन के लिए मैं राइनोमोक्स का उपयोग कर रहा हूं।

उत्तर

5

"कई बार कई मोड़ों को तुरंत चालू करना" कोई समस्या नहीं है। ऑब्जेक्ट्स मुफ्त हैं।

बस सुनिश्चित करें कि आप कई बार नकली कक्षाओं को परिभाषित नहीं कर रहे हैं। कक्षाएं महंगी हैं।

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

0

आप परीक्षण की एएए शैली का उपयोग करना चाहेंगे ताकि आपके पास एक सामान्य सेटअप के साथ कई परीक्षण हो। Here's a decent example.

1

यहाँ मेरी ले है ..

मैं मामले में नकली का उपयोग नहीं होगा ... मैं एक कारखाने विधि का उपयोग वर्ग के एक नकली कार्यान्वयन लौट सकते हैं और बजाय इस कार्यान्वयन उपयोग करने के लिए निर्भरता इंजेक्शन का उपयोग करने के होगा। इस तरह आप डुप्लिकेशंस से बचेंगे और फिर से इस कार्यान्वयन का पुन: उपयोग कर सकते हैं ... फिर से इस फैक्ट्री कार्यान्वयन को ठीक से दोबारा क्रियान्वित करने की आवश्यकता है यानी, कोई डुप्लिकेशन नहीं ..

मैक्स, मुझे लगता है कि जब आप कुछ गतिशील परीक्षण कर रहे हों तो इसका उपयोग किया जाना चाहिए व्यवहार .. जैसे कुछ .. सब-सिस्टम में एक विधि को बुलाया गया था जब मैं SUT पर कुछ क्रिया करता हूं .. और बाद में इस व्यवहार को सत्यापित करने के लिए कॉल सत्यापित() पर ... एक अच्छा भी है मार्टिन फोल्वर ब्लिकी पर लेख Mock Aren't Stubs

0

यदि आप नकली कॉल पर अपेक्षा नहीं करते हैं तो EasyMock जैसे रिकॉर्ड और रीप्ले फ्रेमवर्क विफल हो जाते हैं। लेकिन मॉकिटो जैसे ढांचे बस सभी कॉल रिकॉर्ड करते हैं और आपको केवल उन चीज़ों को सत्यापित करने देते हैं जो महत्वपूर्ण हैं। तो आपको सभी परीक्षणों में सभी विधियों पर उम्मीद स्थापित करने की आवश्यकता नहीं है।

और प्रत्येक परीक्षण विधि में तत्काल मोक्स की आपकी समस्या पर वापस आना, setUp() विधि का उपयोग करने का एक बेहतर तरीका है। मॉकिटो @ मॉक एनोटेशन प्रदान करता है। इसलिए आप अपने चर (फ़ील्ड के रूप में) घोषित करते हैं: @ मॉक रिपोजिटरी रिपोजिटरीमोक

और बस सेट अप() में initMocks() को कॉल करें। घोषणा की गई सभी नकली वस्तुएं स्वचालित रूप से मोक्स बनाने के बिना आपके परीक्षणों में स्वचालित रूप से उपलब्ध होती हैं।

+1

"यदि आप नकली कॉल पर अपेक्षा निर्धारित नहीं करते हैं तो" EasyMock जैसे रिकॉर्ड और रीप्ले फ्रेमवर्क विफल हो जाते हैं। " => यह गलत है। सभी मॉकिंग टूल्स, इज़ीमॉक में शामिल हैं, डेवलपर को "गैर-सख्त" उम्मीदों की अनुमति दें। EasyMock में, आप "createNiceMock()" विधि के साथ "अच्छा" नकली बनाकर ऐसा करते हैं। –

2

मान लीजिए कि आप एनयूनीट का उपयोग कर रहे हैं, तो आप अपने मैक्स के लिए इंस्टेंस चर का उपयोग कर सकते हैं और उन्हें सेटअप/टियरडाउन में रीसेट कर सकते हैं। यदि आप दोहराए गए पैटर्न देखते हैं तो आप उत्पादन कोड के साथ क्या करते हैं: रिफैक्टर और हेल्पर विधियों को निकालें जो व्यक्त करते हैं कि आप क्या हासिल करने की कोशिश कर रहे हैं (यदि कोई समानता नहीं है, तो उत्पादन कोड के डिज़ाइन में कोई समस्या है)।

यदि सेटअप में महत्वपूर्ण डिवीजन हैं, तो अपने उत्पादन वर्ग के लिए एक से अधिक टेस्ट क्लास लिखने पर विचार करें।

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

टेस्ट सुनें!

+0

एक अंतर्दृष्टिपूर्ण उत्तर के लिए बहुत बहुत धन्यवाद। मैं इस बारे में सोच रहा हूं कि मैं उत्पादन वर्ग के लिए कई परीक्षा कक्षाओं के बारे में कैसे लिखूंगा .. मैं कई परीक्षा वर्गों का नाम कैसे दूंगा? – Fadeproof

+1

उनके बारे में महत्वपूर्ण क्या है इसके बाद परीक्षण कक्षाओं का नाम दें - बस अपने सभी अन्य वर्गों की तरह :) –

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