संक्षिप्त जवाब नहीं है"। अधिक दिलचस्प बात यह है कि यह स्थिति क्यों / कैसे उत्पन्न हो सकती है।
मुझे लगता है कि भ्रम पैदा हो रहा है क्योंकि आप कोड के लिए सख्त परीक्षण प्रथाओं (इकाई परीक्षण बनाम एकीकरण परीक्षण, मॉकिंग, आदि) का पालन करने की कोशिश कर रहे हैं जो सख्त प्रथाओं का पालन नहीं करता है।
यह कहना नहीं है कि कोड "गलत" है, या कि विशेष प्रथाएं दूसरों की तुलना में बेहतर हैं। बस यह कि परीक्षण प्रथाओं द्वारा की गई कुछ धारणाएं इस स्थिति में लागू नहीं हो सकती हैं, और कोडिंग प्रथाओं और परीक्षण प्रथाओं में "कठोरता" के समान स्तर का उपयोग करने में मदद मिल सकती है; या कम से कम, यह स्वीकार करने के लिए कि वे असंतुलित हो सकते हैं, जिसके कारण कुछ पहलू अनुचित या निरर्थक होंगे।
सबसे स्पष्ट कारण यह है कि आपका कार्य दो भिन्न कार्य कर रहा है:
Personउनके नाम के आधार पर देख रहे हैं । इसके लिए एकीकरण परीक्षण की आवश्यकता है, यह सुनिश्चित करने के लिए कि यह उन Personवस्तुओं को पा सकता है जो संभवतः अन्यत्र निर्मित / संग्रहीत हैं।
Personउनकी लिंग के आधार पर गणना करना कि क्या यह काफी पुराना है। यह सुनिश्चित करने के लिए यूनिट परीक्षण की आवश्यकता है, गणना अपेक्षित रूप से करती है।
इन कार्यों को एक साथ कोड के एक ब्लॉक में समूहित करके, आप एक को दूसरे के बिना नहीं चला सकते। जब आप गणनाओं का परीक्षण करना चाहते हैं, तो आपको एक Person(वास्तविक डेटाबेस से या स्टब / मॉक से) देखने के लिए मजबूर किया जाता है । जब आप परीक्षण करना चाहते हैं कि लुकअप बाकी सिस्टम के साथ एकीकृत है, तो आप उम्र पर गणना करने के लिए भी मजबूर हैं। हमें उस गणना के साथ क्या करना चाहिए? क्या हमें इसे अनदेखा करना चाहिए, या इसकी जाँच करनी चाहिए? ऐसा लगता है कि सटीक भविष्यवाणी आप अपने प्रश्न में बता रहे हैं।
यदि हम एक विकल्प की कल्पना करते हैं, तो हमारे पास स्वयं इसकी गणना हो सकती है:
def is_old_enough?(person)
if person.male?
return person.age > 21
else
return person.age > 18
end
end
चूंकि यह एक शुद्ध गणना है, इसलिए हमें इस पर एकीकरण परीक्षण करने की आवश्यकता नहीं है।
हमें लुकअप कार्य को अलग से लिखने के लिए भी लुभाया जा सकता है:
def person_from_name(name = 'filip')
return Person::API.new(name)
end
हालाँकि, इस मामले में कार्यक्षमता इतनी करीब है Person::API.newकि मैं कहूंगा कि आपको इसका उपयोग करना चाहिए (यदि डिफ़ॉल्ट नाम आवश्यक है, तो क्या यह क्लास विशेषता की तरह कहीं और संग्रहीत किया जाएगा?)।
जब आप Person::API.new(या person_from_name) के लिए एकीकरण परीक्षण लिख रहे हैं, तो आपको इस बात की परवाह करने की ज़रूरत है कि क्या आपको उम्मीद वापस मिल रही है Person; सभी आयु-आधारित गणनाओं का कहीं और ध्यान रखा जाता है, इसलिए आपके एकीकरण परीक्षण उन्हें अनदेखा कर सकते हैं।