2011-04-29 8 views
7

करते समय निनजेक्ट का उपयोग करते हुए, मोन के साथ एक ऑब्जेक्ट का मज़ाक उड़ाते हुए मुझे निनजेक्ट के साथ यूनिटटेस्टिंग प्रोजेक्ट में मोक का उपयोग करने में परेशानी हो रही है।यूनिटटेस्टिंग

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

मैं निंजा कर्नेल प्राप्त करने के लिए कारखाने के पैटर्न का उपयोग कर रहा हूं जब भी मुझे इसकी आवश्यकता हो आवेदन।

मेरा परीक्षण मॉड्यूल NinjectModule से प्राप्त होता है जहां मैं लोड() विधि को ओवरराइड करता हूं और वहां मैं बाध्यकारी करता हूं। उदाहरण के लिए:

Bind<IStorageManager>().To<StubStorageManager>();

मैं StubStorageManager है, लेकिन यह खाली है। इसमें आईएसटीरेज प्रबंधक से विधियों की घोषणा शामिल है।

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

मुझे आशा है कि मैंने इसे बहुत जटिल नहीं किया है।

कृपया मेरे साथ भालू, मैं मजाक करने और निर्भरता इंजेक्शन के लिए पूरी तरह से नया हूं, लेकिन सीखने के लिए तैयार हूं।

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/1465849/using-ioc-for-unit-testing –

उत्तर

12

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

मुझे लगता है कि आप शायद कुछ इस तरह करना चाहते हैं:

public void ATest(){ 
    //create a mock StorageManager 
    var managerMock = new Mock<IStorageManager>(); 
    //create a mock MessageObject to be used by business logic 
    var messageObjectMock = new Mock<MessageObject>(); 

    //have the storage manager return the mock message when required 
    managerMock.Setup(x => x.GetMessageObject()).Returns(messageObjectMock.Object); 
    //set up message expectations 
    messageObjectMock.Setup(x => x.ThisValueExpected).Returns(10); 
    messageObjectMock.Setup(x => x.ThisFunctionShouldBeCalled()).Verifiable("Function not called."); 

    //thing to test 
    BusinessLogicObject blo = new BusinessLogicObject(managerMock.Object); 
    blo.DoTheThingImTesting(); 

    //make sure the business logic called the expected function, or do whatever check you need... 
    messageObjectMock.Verify(); 
} 
+3

यह वास्तव में क्या है मै करना चाहता था। ठीक है, तो परीक्षण में एक डी कंटेनर का उपयोग करना बुरा है, मैं इसे लेता हूं? ऐसा क्यों हैं? मैंने सोचा कि इसका उपयोग करके, यह मेरे परीक्षणों को सरल बना सकता है, इसलिए मुझे लिखना नहीं है: 'var p = new program (new stubHealthMonitor(), storageManagerMock, new LogManager(), new StubConfigurationManager());' मैंने मूल रूप से सोचा था कि मैं डी कंटेनर उन सभी चीजों का ख्याल रखेगा जो सीधे इस परीक्षण को शामिल नहीं करते हैं, लेकिन एक चीज जिसमें परीक्षण शामिल होता है, मैं अपने आप को मोक के माध्यम से निर्दिष्ट कर सकता हूं। –

+5

मुझे यकीन नहीं है कि मैं अब तक कहूंगा कि परीक्षण में DI का उपयोग करके "बुरा" है। उप-इष्टतम हो सकता है;) जो चीज आप अपने परीक्षणों के साथ करना चाहते हैं वह जितना संभव हो उतना बाहरी 'सामान' को निकालना है और केवल उस चीज का उपयोग करें जिसका आप परीक्षण कर रहे हैं। यदि आप अपने परीक्षणों में डीआई का उपयोग करते हैं तो अब आपके निर्भरता इंजेक्शन की अतिरिक्त जटिलता है। उस समय आप अपने डीआई के साथ-साथ परीक्षण के तहत चीज का परीक्षण कर रहे हैं। आप अपने परीक्षणों में डीआई का उपयोग करने के लिए एक केस बनाने में सक्षम हो सकते हैं हालांकि मुझे अभी तक कभी आवश्यकता नहीं है। DI का उपयोग करते समय कुछ भी कसकर कुछ भी नहीं होना चाहिए - DI सहित, आपको इसकी आवश्यकता नहीं होनी चाहिए। –