6

के साथ विभिन्न कॉन्फ़िगरेशन का उपयोग करें मैं Simple Injector निर्भरता इंजेक्शन ढांचे का उपयोग कर रहा हूं और यह अच्छा और अच्छा लग रहा है। लेकिन कॉन्फ़िगरेशन बनाने और इसका उपयोग करने के बाद, अब मैं जानना चाहता हूं कि एक कॉन्फ़िगरेशन से दूसरे कॉन्फ़िगरेशन में कैसे बदला जाए।सरल इंजेक्टर

परिदृश्य: मान लें कि मैंने ग्लोबल असैक्स में एक कॉन्फ़िगरेशन स्थापित किया है और मेरे पास सार्वजनिक और वैश्विक Container उदाहरण है। अब मैं कुछ परीक्षण करना चाहता हूं और मैं उन्हें नकली कक्षाओं का उपयोग करना चाहता हूं इसलिए मैं कॉन्फ़िगरेशन को बदलना चाहता हूं।

मैं निश्चित रूप से एक और कॉन्फ़िगरेशन बना सकता हूं और डिफ़ॉल्ट रूप से बनाए गए वैश्विक Container को असाइन कर सकता हूं, ताकि जब भी मैं परीक्षण चलाता हूं तो वैकल्पिक कॉन्फ़िगरेशन सेट किया जाएगा। लेकिन ऐसा करने पर और हालांकि मैं विकास संदर्भ में हूं Container सामान्य अनुरोधों के लिए भी सभी के लिए बदल दिया गया है। मुझे पता है कि मैं इस संदर्भ में परीक्षण कर रहा हूं और इससे कोई फर्क नहीं पड़ता, लेकिन मुझे यह महसूस हो रहा है कि यह ऐसा करने का तरीका नहीं है ... और मुझे आश्चर्य है कि एक कॉन्फ़िगरेशन से दूसरे तरीके से सही तरीके से कैसे बदला जाए।

+0

क्या आप स्वचालित परीक्षण स्थापित करने के बारे में बात कर रहे हैं?यदि ऐसा है, तो प्रत्येक टेस्ट केस से पहले कंटेनर (जहां आवश्यक हो वहां मिक्स का उपयोग करें) का पुनर्निर्माण करें। यह एमएसटीएस्ट में '[testInitialize]' और NUnit में '[SetUp]' है। –

उत्तर

6

यूनिट परीक्षण करते समय, आपको कंटेनर का बिल्कुल उपयोग नहीं करना चाहिए। बस अपने कन्स्ट्रक्टर को कॉल करके और उचित नकली वस्तुओं के साथ आपूर्ति करके परीक्षण के तहत कक्षा बनाएं।

एक पैटर्न जिसने मुझे अतीत में बहुत मदद की है, एक साधारण परीक्षण वर्ग-विशिष्ट फैक्ट्री विधि का उपयोग है। यह विधि परीक्षण के तहत कक्षा के निर्माण को केंद्रीकृत करती है और परीक्षण परिवर्तन के तहत कक्षा की निर्भरता के दौरान किए जाने वाले परिवर्तनों की मात्रा को कम करता है।

private ClassUnderTest CreateValidClassUnderTest(params object[] dependencies) 
{ 
    return new ClassUnderTest(
     dependencies.OfType<ILogger>().SingleOrDefault() ?? new FakeLogger(), 
     dependencies.OfType<IMailSender>().SingleOrDefault() ?? new FakeMailer(), 
     dependencies.OfType<IEventPublisher>().SingleOrDefault() ?? new FakePublisher()); 
} 

एकीकरण परीक्षण के लिए यह कंटेनर का उपयोग कर, और कंटेनर के कुछ ही निर्भरता स्वैप और अधिक आम है: इस तरह इस तरह के कारखाने विधि कैसा नज़र आ सकता है। फिर भी, वे एकीकरण परीक्षण आपके अनुप्रयोग_स्टार्ट में बनाए गए कंटेनर का उपयोग नहीं करेंगे, लेकिन प्रत्येक एकीकरण परीक्षण में उस मामले में सबसे अधिक संभावना है कि इसका अपना नया कंटेनर उदाहरण हो, क्योंकि प्रत्येक परीक्षण अलगाव में चलाना चाहिए। और यहां तक ​​कि यदि आपने application_start से एक कंटेनर का उपयोग किया है, तो भी आपका एकीकरण परीक्षण एक अलग प्रोजेक्ट से चलाया जाता है और आपके चल रहे एप्लिकेशन में हस्तक्षेप नहीं करेगा।

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

इस कोड को निकालने: आपको एक से अधिक अंत एप्लिकेशन की अनुमति मिलती है जो आंशिक रूप से समान कॉन्फ़िगरेशन साझा करती है; आपको एकीकरण परीक्षण में कंटेनर को सत्यापित करने की अनुमति देता है; और आपको उन सेवाओं को जोड़ने की अनुमति देता है जिन्हें आपके एकीकरण परीक्षणों से मजाक करने की आवश्यकता होती है।

जीवन को आसान बनाने के लिए, सरल इंजेक्टर आपको मौजूदा पंजीकरण को नए (उदाहरण के लिए एक मजाकिया) से प्रतिस्थापित करने की अनुमति देता है। आप इसे निम्नानुसार सक्षम कर सकते हैं:

container.Options.AllowOverridingRegistrstions = true; 

लेकिन इससे सावधान रहें! यह विकल्प इस तथ्य को छुपा सकता है कि आपने गलती से पंजीकरण को ओवरराइड किया है। मेरे अनुभव में यह ज्यादातर मामलों में एक अधूरा कंटेनर बनाने के लिए बेहतर होता है और बाद में ओवरराइड करने के बजाय गायब पंजीकरण को जोड़ता है। या यदि आप ओवरराइड करने का निर्णय लेते हैं, तो किसी भी आकस्मिक गलत कॉन्फ़िगरेशन को रोकने के लिए अंतिम संभव पल में सुविधा सक्षम करें।

+0

धन्यवाद। ऐसा लगता है कि मैं कल्पना कर रहा था। –