संभव डुप्लिकेट:
Using IoC for Unit Testingसंयोजन यूनिट टेस्ट (मजाक) और एक निर्भरता इंजेक्शन फ्रेमवर्क
मुझे लगता है कि मैं जिस तरह से यूनिट टेस्ट और/या निर्भरता इंजेक्शन कर रहे हैं समझने में कुछ समस्या है काम कर रहे। मैं यूनिट परीक्षण और निनजेक्ट के लिए एक निर्भरता इंजेक्शन फ्रेमवर्क के रूप में न्यूटिट और राइनो मोक्स का उपयोग कर रहा हूं। आम तौर पर, हालांकि मैं उन दोनों को परेशानियों के अनुरूप फिट करूंगा - लेकिन किसी भी तरह, ऐसा लगता है कि यह समझने के लिए और अधिक जटिल और कठिन हो जाता है।
(मैं इसे साफ और आसान रखने के लिए एक अच्छा उदाहरण बनाने की कोशिश करूंगा। यह मेरे बारे में है, बाइक की सवारी)।
1.) डि बिना/यूनिट टेस्ट:
डि और यूनिट टेस्ट के बिना जाने, मेरे कोड इस तरह देखा होगा - और मैं खुशी होगी:
public class Person
{
public void Travel()
{
Bike bike = new Bike();
bike.Ride();
}
}
public class Bike
{
public void Ride()
{
Console.WriteLine("Riding a Bike");
}
}
सवारी करने के लिए मेरी बाइक मैं होता बस जरूरत है: new Person().Travel();
2.) डि के साथ:
मुझे लगता है कि तंग युग्मन नहीं करना चाहते, तो मैं एक अंतरफलक और एक NinjectModule की जरूरत है! मेरे पास कुछ ओवरहेड होगा, लेकिन यह ठीक होगा, जब तक कोड को पढ़ने और समझने में आसान हो। मैं सिर्फ संशोधित व्यक्ति वर्ग के लिए कोड पारित होगा, बाइक वर्ग अपरिवर्तित है:
public class Person
{
IKernel kernel = new StandardKernel(new TransportationModule());
public void Travel()
{
ITransportation transportation = kernel.Get<ITransportation>();
transportation.Ride();
}
}
मैं अभी भी बस के साथ अपने मोटर साइकिल की सवारी कर सकते हैं: new Person().Travel();
3.) यूनिट टेस्टिंग को ध्यान में रखते (बिना DI):
यह देखने में सक्षम होने के लिए कि क्या राइड-विधि ठीक से कहा जाता है, मुझे एक मॉक की आवश्यकता होगी। जहां तक मुझे पता है, इंटरफ़ेस इंजेक्ट करने के लिए दो तरीके हैं: कन्स्ट्रक्टर इंजेक्शन और सेटर इंजेक्शन। मैं अपने उदाहरण के लिए निर्माता इंजेक्शन चुनें:
public class Person
{
ITransportation transportation;
public person(ITransportation transportation)
{
this.transportation = transportation;
}
public void Travel()
{
transportation.Ride();
}
}
इस बार, मैं बाइक से पारित करने के लिए neet होगा: new Person(new Bike()).Travel();
4.) डि के साथ और यूनिट टेस्ट
में वर्ग के लिए तैयारी 3. यूनिट-टेस्टिंग (डीआई के बिना) ध्यान में बिना काम किए काम करेगा, लेकिन मुझे new Person(kernel.Get<ITransportation>());
पर कॉल करने की आवश्यकता होगी। इसके माध्यम से, ऐसा लगता है कि मैं डीआई से लाभ खो रहा हूं - व्यक्ति वर्ग किसी भी युग्मन के बिना यात्रा को कॉल कर सकता है और यह जानने की आवश्यकता है कि परिवहन किस प्रकार की कक्षा है। साथ ही, मुझे लगता है कि इस फॉर्म में उदाहरण की बहुत अधिक पठनीयता की कमी है।
क्या यह किया जाता है? या क्या अन्य - निर्भरता इंजेक्शन और इकाई परीक्षण (और नकली) की संभावना को प्राप्त करने के अधिक सुंदर तरीके हैं?
(वापस देखकर, ऐसा लगता है कि उदाहरण वास्तव में बुरा है - हर किसी को पता होना चाहिए कि इस समय वह किस तरह का परिवहन उपकरण सवारी कर रहा है ...)
मुझे लगता है कि आप निर्भरता इंजेक्शन (डीआई) और नियंत्रण में परिवर्तन (आईओसी) की परिभाषाओं के बारे में भ्रमित हो रहे हैं। आप तीसरे आंकड़े हैं * करता है * डी लागू करें (आपने निर्भरता को निर्भरता में स्थानांतरित कर दिया है), आपका दूसरा आंकड़ा निर्भरताओं को हल करने के लिए आईओसी (निनजेक्ट) कंटेनर का उपयोग कर रहा है। –
zapthedingbat सही है। आप तीसरे उदाहरण में डी कर रहे हैं, लेकिन डीआई कंटेनर का उपयोग न करें, जो ठीक है। डीआई करते समय डी कंटेनर वैकल्पिक है। – Steven
उदाहरण "2." DI का उपयोग नहीं करता है, लेकिन एक "सेवा लोकेटर" ... –