डीडीडी करते समय क्या हमें संस्थाओं और वस्तुओं का मजाक उड़ाना चाहिए?


9

Newable बनाम Injectable ऑब्जेक्ट्स के बारे में कुछ लेख पढ़ने के बाद और ये अवधारणाएँ DDD की सेवाओं, संस्थाओं और मूल्य वस्तुओं से कैसे संबंधित हैं, मुझे अपने कोड में विशेष रूप से मेरे यूनिट परीक्षणों में newables का उपयोग करने के बारे में कुछ संदेह के साथ छोड़ दिया गया था।

नवाबों के लिए मुख्य उम्मीदवार एंटिटीज और वैल्यू ऑब्जेक्ट्स थे, जिसका अर्थ था कि इन निर्भरताओं को अन्य ऑब्जेक्ट्स में इंजेक्ट करने के बजाय newइन ऑब्जेक्ट्स का एक उदाहरण होना चाहिए और कोड में सीधे उनका उपयोग करना चाहिए ।

हालांकि, अच्छा डीडीडी संस्थाओं को जिम्मेदारियां सौंपने की वकालत करता है और अगर उन्हें उचित समझा जाता है तो वस्तुओं को महत्व देता है। तो संस्थाओं और मूल्य वस्तुओं में कुछ गंभीर व्यापार तर्क समाप्त हो जाएगा।

अब यदि कोई सेवा किसी इकाई या मूल्य वस्तु पर चल रही है, तो क्या मुझे इकाई या मूल्य वस्तु का मखौल उड़ाना चाहिए और सेवा को मॉक पास करना चाहिए (मॉकिंग के interfaceलिए उन मूल्य वस्तुओं या संस्थाओं की आवश्यकता होगी, जिनके खिलाफ पैरवी की जाती है)?

या क्या मुझे सिर्फ newएक इकाई / मूल्य वस्तु चाहिए और सेवा के लिए एक ठोस कार्यान्वयन पास करना चाहिए और इस प्रकार केवल एक इकाई के परीक्षण के इकाई परीक्षण सिद्धांत का उल्लंघन करना चाहिए?



यह निर्भर करता है कि क्या आप एक शास्त्रीय या मॉकिस्ट परीक्षक हैं: martinfowler.com/articles/mocksArentStubs.html
jhewlett

@jhewlett एक क्लासिकिस्ट कुछ भी मज़ाक नहीं करेगा; एक मॉकिस्ट सबसे अधिक संभावना केवल मॉक सर्विसेज, रिपॉजिटरी और फैक्ट्रीज (जो "इंजेक्टेबल" हैं), कभी भी एंटिटीज या वैल्यू ऑब्जेक्ट्स नहीं हैं (जो "न्यूवेबल्स" हैं)।
रोजरियो

@ रोजेरियो, जब आप कहते हैं कि सेवाएं; क्या आपका मतलब एप्लीकेशन सर्विसेज या डोमेन सर्विसेज से है?
w0051977

@Songo, आपने क्या निर्णय लिया? क्या आप मजाक करते हैं: संस्थाओं; मान ऑब्जेक्ट और डोमेन सेवाएँ?
w0051977

जवाबों:


11

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

इन स्थितियों में, मेरे पास दर्शन है, जो दिया गया हैडोमेन ऑब्जेक्ट की अपनी व्यापक इकाई परीक्षण कवरेज है, यह विश्वास करते हुए कि ऑब्जेक्ट एक अलग SUT के लिए एक इकाई परीक्षण में डिज़ाइन किया गया है, आवश्यक रूप से इकाई परीक्षण का उल्लंघन नहीं करता है। यदि यह परीक्षण डोमेन में परिवर्तन के कारण टूटना था, तो मुझे उम्मीद है कि डोमेन ऑब्जेक्ट की यूनिट परीक्षण के रूप में अच्छी तरह से तोड़ने के लिए, मुझे जांच करने के लिए कुछ की ओर ले जाएगा। यदि डोमेन ऑब्जेक्ट की यूनिट परीक्षण को लाल परीक्षण के रूप में ठीक से अपडेट किया गया था, तो परिवर्तन के साथ हरा बना दिया गया था, और यह अन्य परीक्षण फिर विफल हो गया, यह जरूरी नहीं कि एक बुरी चीज है; इसका अर्थ है कि डोमेन के लिए नई उम्मीदों के साथ इस अन्य परीक्षण संघर्ष की अपेक्षाएं, और मुझे यह सुनिश्चित करने की आवश्यकता है कि दोनों एक-दूसरे के साथ सहमत हों और सिस्टम की ओवररचिंग स्वीकृति मानदंड।

जैसे कि, मैं केवल एक डोमेन ऑब्जेक्ट का मजाक उड़ाऊंगा यदि उक्त डोमेन ऑब्जेक्ट "साइड इफेक्ट्स" उत्पन्न करता है जो एक यूनिट-परीक्षण परिप्रेक्ष्य (यानी डेटा स्टोर जैसे बाहरी संसाधनों को छूना) से अवांछनीय था, या यदि डोमेन ऑब्जेक्ट का तर्क पर्याप्त रूप से जटिल था, तो परीक्षण के लिए इसे उचित अवस्था में रखना परीक्षण को परिभाषित करने और पारित करने के लिए एक अवरोधक बन जाता है।

फिर वह ड्राइविंग प्रश्न बन जाता है; कौन सा आसान है? परीक्षण के भीतर अपने इच्छित उद्देश्य के लिए डोमेन ऑब्जेक्ट का उपयोग करने के लिए, या इसका मजाक उड़ाने के लिए? जो भी आसान है, जब तक यह अब आसान विकल्प नहीं है, जैसे कि जब एक कार्यात्मक परिवर्तन एक जटिल तरीके से सेवा के परीक्षण को तोड़ता है; यदि ऐसा होता है, तो परीक्षण को फिर से लिखना एक मॉक का उत्पादन करने के लिए है जो सेवा द्वारा निर्भर कार्यात्मक आवश्यकताओं को उजागर करता है, बिना जटिलता के जो इसे तोड़ता है।

यह समझें कि किसी भी तरह से, एक एकीकरण परीक्षण होना चाहिए जो वास्तविक डोमेन में प्लग की गई वास्तविक डोमेन ऑब्जेक्ट का उपयोग करता है जो इन दोनों के बीच बातचीत को अमूर्त के उच्च स्तर पर परीक्षण करता है (जैसे कि परीक्षण, उदाहरण के लिए, न केवल एक सेवा के पीछे कार्यक्षमता। समापन बिंदु, लेकिन एक प्रॉक्सी जिस पर डोमेन ऑब्जेक्ट को क्रमबद्ध और भेजा जाता है)।


DDD में, "डोमेन मॉडल" में केवल एंटिटीज और वैल्यू ऑब्जेक्ट्स ही नहीं, डोमेन सर्विसेज, रिपॉजिटरी और फैक्ट्रीज भी शामिल हैं।
रोजरियो

0

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

इसलिए यूनिट परीक्षणों के लिए मेरी राय में, आश्रित कक्षाओं का मजाक उड़ाया जाना चाहिए। यदि ऐसा नहीं कर रहे हैं, तो इसका एक अभिन्न परीक्षण है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.