इकाई परीक्षण के लिए IoC का उपयोग करना


97

इकाई परीक्षण के लिए IoC कंटेनर का उपयोग कैसे किया जा सकता है? क्या आईओसी का उपयोग करके एक विशाल समाधान (50+ परियोजनाओं) में मोक्स का प्रबंधन करना उपयोगी है? कोई अनुभव? कोई C # लाइब्रेरी जो यूनिट परीक्षणों में इसका उपयोग करने के लिए अच्छी तरह से काम करती है?


7
@ मर्क सेमन इसे इंगित करने के लिए बहुत विनम्र होगा, लेकिन यदि आप इस प्रश्न में रुचि रखते हैं, तो आपको कम से कम ऑटोफिक्सचर के
रुबेल बार्टलिंक

1
DI के बीच संबंधों के बारे में एक अच्छी बात है और मिगुएल कास्त्रो द्वारा Vimeo पर मज़ाक उड़ाया गया है: vimeo.com/68390510
GregC

जवाबों:


131

आमतौर पर, यूनिट परीक्षण के लिए DI कंटेनर आवश्यक नहीं होना चाहिए क्योंकि इकाई परीक्षण सभी जिम्मेदारियों को अलग करने के बारे में है।

एक वर्ग पर विचार करें जो कंस्ट्रक्टर इंजेक्शन का उपयोग करता है

public MyClass(IMyDependency dep) { }

आपके पूरे आवेदन में, यह हो सकता है कि पीछे एक बहुत बड़ी निर्भरता ग्राफ छिपा हो IMyDependency, लेकिन एक इकाई परीक्षण में, आप इसे एक एकल टेस्ट डबल तक समतल कर देते हैं ।

टेस्ट डबल उत्पन्न करने के लिए आप Moq या RhinoMocks जैसे डायनेमिक मॉक का उपयोग कर सकते हैं, लेकिन इसकी आवश्यकता नहीं है।

var dep = new Mock<IMyDependency>().Object;
var sut = new MyClass(dep);

कुछ मामलों में, एक ऑटो-मॉकिंग कंटेनर के लिए अच्छा हो सकता है, लेकिन आपको उसी डीआई कंटेनर का उपयोग करने की आवश्यकता नहीं है जो उत्पादन एप्लिकेशन उपयोग करता है।


13
सहमत ... जब तक एक परीक्षण लक्ष्य पर निर्भरता के रूप में IoC कंटेनर नहीं है, तब तक आपके परीक्षणों को उनकी आवश्यकता नहीं होनी चाहिए ... जब आप अपनी इकाई परीक्षण करते हैं, तो आप ऑब्जेक्ट ग्राफ के बहुमत को हटाने जा रहे हैं।
एंडरसन Imes

4
@ मर्क सीमन यह समझ में आता है ... लेकिन एकीकरण परीक्षणों के बारे में क्या? यानी, मैं यूआई परीक्षणों के साथ खेलता था और मुझे उस स्थिति का सामना करना पड़ा जब मुझे रचना रूट को साझा करना था। कोई टिप्पणी?
अर्निस लैप्सा

5
@ अर्निस एल .: एकीकरण परीक्षणों के लिए यह कम महत्वपूर्ण है। आप घटकों को तार करने के लिए DI कंटेनर का उपयोग करने का विकल्प चुन सकते हैं, लेकिन यदि ऐसा है, तो आपको पूर्ण अनुप्रयोग की तुलना में कंटेनर के लिए एक अलग कॉन्फ़िगरेशन की आवश्यकता होगी - जब तक कि आप एक सबकटेस्टिक टेस्ट या पूर्ण सिस्टम टेस्ट नहीं करते हैं, जिस स्थिति में आप कंटेनर के अनुप्रयोग के कॉन्फ़िगरेशन का पुन: उपयोग कर सकते हैं।
मार्क सेमन


18

यूनिट परीक्षण के लिए आईओसी कंटेनर का उपयोग कैसे किया जा सकता है?

IoC प्रोग्रामिंग प्रतिमानों को लागू करेगा जो अलगाव में इकाई परीक्षण करेगा (अर्थात मोज़ेक का उपयोग करके) आसान: इंटरफेस का उपयोग, कोई नया (), कोई एकल नहीं ...

लेकिन परीक्षण के लिए IoC कंटेनर का उपयोग करना वास्तव में एक आवश्यकता नहीं है, यह सिर्फ कुछ सुविधाएं प्रदान करेगा जैसे कि मॉक का इंजेक्शन लेकिन आप इसे मैन्युअल रूप से कर सकते हैं।

क्या आईओसी का उपयोग करके एक विशाल समाधान (50+ परियोजनाओं) में मोक्स का प्रबंधन करना उपयोगी है?

मुझे यकीन नहीं है कि आईओसी का उपयोग करके मोक्स का प्रबंधन करने से आपका क्या मतलब है। वैसे भी, IoC कंटेनर आम तौर पर परीक्षण करने की बात आने पर नकली इंजेक्शन लगाने से ज्यादा कर सकते हैं। और अगर आपके पास सभ्य IDE समर्थन है जो रिफैक्टिंग को संभव बनाता है, तो इसका उपयोग क्यों नहीं कर रहा है?

कोई अनुभव?

हां, एक विशाल समाधान पर, आपको पहले से अधिक गैर-त्रुटि-रहित और रीफैक्टरिंग-प्रतिकूल समाधान (यानी या तो एक प्रकार के सुरक्षित आईओसी कंटेनर या अच्छे आईडीई समर्थन के माध्यम से) की आवश्यकता होती है।


17

मैं अक्सर अपने परीक्षणों में एक आईओसी कंटेनर का उपयोग करता हूं। दी, वे शुद्ध अर्थों में "इकाई परीक्षण" नहीं हैं। IMO वे अधिक BDDish हैं और रिफैक्टरिंग की सुविधा प्रदान करते हैं। टेस्ट आपको रिफ्लेक्टर पर विश्वास दिलाने के लिए हैं। खराब लिखित परीक्षण आपके कोड में सीमेंट डालने जैसा हो सकता है।

निम्नलिखित को धयान मे रखते हुए:

[TestFixture]
public class ImageGalleryFixture : ContainerWiredFixture
{
    [Test]
    public void Should_save_image()
    {
        container.ConfigureMockFor<IFileRepository>()
            .Setup(r => r.Create(It.IsAny<IFile>()))
            .Verifiable();

        AddToGallery(new RequestWithRealFile());

        container.VerifyMockFor<IFileRepository>();
    }

    private void AddToGallery(AddBusinessImage request)
    {
        container.Resolve<BusinessPublisher>().Consume(request);
    }
}

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

इस तकनीक का उपयोग करते समय एक ऑटो-मॉकिंग कंटेनर एक्सटेंशन काम में आता है: http://www.agileatwork.com/auto-mocking-unity-container-extension/


8
वाक्यांश के लिए +1 "अपने कोड में सीमेंट डालना"। मैंने इसे हर समय उपयोग करना शुरू कर दिया है।
एंड्रयू शेफर्ड

2

SimpleInjector , DryIoc (इसकी खान) जैसी अपंजीकृत / uknown सेवाओं को हल करने की क्षमता वाले कंटेनरों का उपयोग करके अभी तक लागू नहीं किए गए इंटरफेस के लिए नकली वापस आ सकते हैं।

जिसका अर्थ है कि आप विकास को पहले सरल कार्यान्वयन और इसके प्रति निर्भरता के साथ शुरू कर सकते हैं, और आपकी प्रगति के रूप में उन्हें वास्तविक चीज़ से बदल सकते हैं।

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