मान लीजिए कि मैं एक हास्केल फ़ंक्शन f (या तो शुद्ध या एक क्रिया) को परिभाषित कर रहा हूं और कहीं f f कॉल फंक्शन जी के भीतर। उदाहरण के लिए:हास्केल में परीक्षण के लिए कैसे नकल करें?
f = ...
g someParms
...
मैं इकाई परीक्षण के लिए एक नकली संस्करण के साथ फ़ंक्शन जी को कैसे बदलूं?
यदि मैं जावा में काम कर रहा था, तो जी SomeServiceImpl
पर एक विधि होगी जो इंटरफ़ेस SomeService
लागू करता है। फिर, मैं SomeServiceImpl
या MockSomeServiceImpl
का उपयोग करने के लिए एफ को बताने के लिए निर्भरता इंजेक्शन का उपयोग करूंगा। मुझे यकीन नहीं है कि हास्केल में यह कैसे करें।
class SomeService a where
g :: a -> typeOfSomeParms -> gReturnType
data SomeServiceImpl = SomeServiceImpl
data MockSomeServiceImpl = MockSomeServiceImpl
instance SomeService SomeServiceImpl where
g _ someParms = ... -- real implementation of g
instance SomeService MockSomeServiceImpl where
g _ someParms = ... -- mock implementation of g
फिर, च के रूप में निम्नानुसार को फिर से परिभाषित:
यह एक प्रकार वर्ग SomeService लागू करने के लिए क्या करने के लिए सबसे अच्छा तरीका है
f someService ... = ...
g someService someParms
...
ऐसा लगता है कि यह काम करेगा, लेकिन मैं कर रहा हूँ बस हास्केल सीखना और सोचना कि क्या ऐसा करने का यह सबसे अच्छा तरीका है? आम तौर पर, मुझे निर्भरता इंजेक्शन का विचार सिर्फ मॉकिंग के लिए नहीं, बल्कि कोड को अधिक अनुकूलन और पुन: प्रयोज्य बनाने के लिए भी पसंद है। आम तौर पर, मुझे लगता है कि कोड का एक टुकड़ा उपयोग करने वाली किसी भी सेवा के लिए एक ही कार्यान्वयन में बंद नहीं किया जा रहा है। निर्भरता इंजेक्शन के लाभ प्राप्त करने के लिए कोड में बड़े पैमाने पर उपरोक्त चाल का उपयोग करना एक अच्छा विचार माना जाएगा?
संपादित करें:
के इस एक कदम आगे ले चलते हैं। मान लीजिए कि मेरे पास एक मॉड्यूल में ए, बी, सी, डी, ई, और एफ की एक श्रृंखला है, जो सभी को एक अलग मॉड्यूल से कार्यों g, h, i, और j संदर्भित करने में सक्षम होना चाहिए। और मान लीजिए कि मैं फ़ंक्शन g, h, i, और j mock करने में सक्षम होना चाहता हूं। मैं स्पष्ट रूप से 4 कार्यों को ए-एफ के पैरामीटर के रूप में पास कर सकता हूं, लेकिन यह सभी कार्यों में 4 पैरामीटर जोड़ने के लिए थोड़ा दर्द है। इसके अलावा, अगर मुझे कभी भी किसी अन्य विधि को कॉल करने के लिए ए-एफ के कार्यान्वयन को बदलने की आवश्यकता है, तो मुझे इसके हस्ताक्षर को बदलने की आवश्यकता होगी, जो एक बुरा रिफैक्टरिंग व्यायाम कर सकता है।
इस प्रकार की स्थिति को बनाने के लिए कोई भी युक्ति आसानी से काम करती है? उदाहरण के लिए, जावा में, मैं अपनी सभी बाहरी सेवाओं के साथ एक वस्तु का निर्माण कर सकता हूं। कन्स्ट्रक्टर सेवा चर में सेवाओं को बंद कर देगा। फिर, कोई भी तरीका सदस्य चर के माध्यम से उन सेवाओं तक पहुंच सकता है। इसलिए, जैसा कि सेवाओं में विधियों को जोड़ा जाता है, विधि विधि में से कोई भी परिवर्तन नहीं बदलता है। और यदि नई सेवाओं की आवश्यकता है, तो केवल कन्स्ट्रक्टर विधि हस्ताक्षर बदलता है।
क्यों शुद्ध कार्यों का नकल करना चाहते हैं? – yairchu
अच्छा बिंदु, yairchu। आप शायद केवल नकली कार्रवाई करेंगे। –
@yairchu मैं इसे दक्षता कारणों से करूँगा। क्या उत्पादकता के लिए एक्स या 100x समय लेना परीक्षण बेहद महत्वपूर्ण है। तो मैं परीक्षण उद्देश्यों के लिए फैक्टरियल 100000000 = <कुछ बड़ी संख्या> कहना चाहूंगा (इस प्रकार इनपुट/नकली के रूप में अन्य परीक्षण)। लेकिन उस फैक्टरियल 100000000 = <कुछ बड़ी संख्या> टेस्ट रनर फैक्टरियल मॉड्यूल पर चलने पर खुद में एक परीक्षण हो सकती है। – user239558