2010-02-07 19 views
9

मैं DI आईओसी के लिए एक वेब प्रोजेक्ट में स्ट्रक्चर मैप का उपयोग कर रहा हूं। यह सही काम करता है, लेकिन मुझे कोई संकेत नहीं है कि स्ट्रक्चर मैप के साथ यूनिट परीक्षण कैसे लिखें।यूनिट परीक्षणों के साथ स्ट्रक्चर मैप का उपयोग

मैं AssemblyInitialize में ऐसा करना चाहिए Global.asax में तरह StructureMap का विन्यास शुरू छोड़कर DataContext के लिए लाइव LinqToSqlDataContext लेकिन इस तरह की कुछ स्मृति डेटा का उपयोग नहीं:

[AssemblyInitialize] 
public static void Start() 
{ 
     ObjectFactory.Configure(x => 
       { 
        x.For<IDataContext>().HttpContextScoped().Use<MemoryDataContext>() 
         .Ctor<string>("connectionString") 
         .Is(ConfigurationManager.ConnectionStrings["DEVConnection"].ConnectionString); 
        x.For<IDepartamentRepository>().Use<DepartamentDB>(); 
        x.For<IDevelopmentProcess>().Use<DevelopmentProcesses>().OnCreation(c => c.User = Current.CurrentUser); 
        x.For<IActivityProcess>().Use<ActivitiesProcess>().OnCreation(c=> c.User = Current.CurrentUser); 
        x.For<IDevDeveloperRepository>().Use<DevDeveloperDB>(); 
        x.For<IDevelopmentRepository>().Use<DevelopmentDB>(); 
        x.For<IActivityRepository>().Use<ActivityDB>(); 
        x.For<IActivityTypeRepository>().Use<ActivityTypeDB>(); 
        x.For<IDevUserRepository>().Use<DevUsersDB>(); 
        x.For<IAttachmentRepository>().Use<AttachmentDB>(); 
       } 
      ); 
} 

और फिर ObjectFactory.GetInstance का उपयोग करें() परीक्षण या मैं यह कैसे करूँ?

उत्तर

21

आपको use a DI Container in unit tests पर बिल्कुल आवश्यकता नहीं है।

एक कंटेनर कुछ है जो आप घटकों को तारों के साथ उपयोग करने के लिए उपयोग करते हैं, लेकिन यूनिट टेस्ट अलगाव में प्रत्येक घटक का परीक्षण होता है।

+0

मैं इससे सहमत है, लेकिन क्या अगर मैं एक वर्ग है कि कई उदाहरण खपत है सब मैं करूंगा DI का उपयोग करके स्वैप मेमोरी रिपोजिटरी में उपयोग करने के लिए डीएएल कहें। यदि मेरा कन्स्ट्रक्टर 10 इंटरफेस लेता है तो मुझे DI का उपयोग करते समय मैन्युअल रूप से 10 उदाहरण प्रदान करने की आवश्यकता होती है, सभी स्वचालित रूप से किए जाते हैं। यहां तक ​​कि अगर मैं एक में 10 इंटरफेस की रचना तैयार करता हूं, तो मुझे अभी भी इसे किसी भी तरह से नकल करने की ज़रूरत है ... –

+0

@PawelCioch यदि आपका कन्स्ट्रक्टर दस निर्भरता लेता है, तो यह [शायद बहुत अधिक कर रहा है] (http://stackoverflow.com/a/2420245/126,014)। न केवल यह एक डिजाइन गंध है, यह भी संभावना है कि परीक्षण करना मुश्किल होगा, या कम से कम परीक्षणों को बनाए रखने के लिए। –

+0

मुझे लगता है कि मुझे सरल परियोजनाओं के साथ काम करने के लिए नौकरी बदलनी होगी :)। वह वर्ग जो उन सभी को लेता है वह कंसोल ऐप के लिए अंतिम सेवा है जिसे सभी प्रकार की रिपॉजिटरीज और फ़िल्टर की आवश्यकता होती है। शायद फिर से कारक हो सकता है लेकिन एल्गोरिदम इतने जुड़े हुए हैं कि काम की इकाई को अलग करना मुश्किल है। प्रतिक्रिया के लिए किसी भी तरह धन्यवाद। –

5

मैं मार्क से सहमत हूं। टेस्टेबिलिटी उन प्राथमिक कारणों में से एक है जिनकी आप पहली जगह कंटेनर का उपयोग कर रहे हैं।

ऐसे समय होते हैं जहां आपके कंटेनर सेटअप के लिए एकीकरण परीक्षण बनाना एक अच्छा विचार हो सकता है। उदाहरण के लिए यदि आपके कंटेनर कॉन्फ़िगरेशन में आपका कोई व्यवहार है तो आप उस व्यवहार के लिए परीक्षण बनाना चाहेंगे। आप कंटेनर कॉन्फ़िगरेशन में कॉन्फ़िगरेशन प्रबंधक के माध्यम से IDataContext की कनेक्शन स्ट्रिंग सेट करते हैं।

निम्न कोड इस तरह के सेटअप का परीक्षण करने के लिए मैं करता हूं। सूचना मैं से बचने ObjectFactory (स्थिर सिंगलटन वस्तुओं के लिए अपने स्वयं समस्या है) और एक bootstrapper सहायक कक्षा में मेरी कंटेनर सेटअप लपेट:

[Test] 
public void connection_string_should_come_from_application_configuration() 
{ 
    var container = new ContainerBootstraper().Container; 

    var connectionString = container.GetInstance<IDataContext>().ConnectionString 

    connectionString.ShouldEqual("test project application configuration connection string"); 
} 
+0

क्या इस मामले में प्रश्न में सीधे 'AppEqual' तुलना को इंगित करना गलत होगा? जब यूनिट परीक्षण सर्वोत्तम प्रथाओं की बात आती है तो मैं एक सुराग रखने का नाटक नहीं करता, लेकिन जैसा कि मैंने इसे पढ़ा था, मैंने सोचा था कि यह पुष्टि नहीं कर रहा था कि यह कॉन्फ़िगरेशन से आया है। – patridge

+0

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

+0

कोई भी मौका आप उस बूटस्ट्रैपर कक्षा के साथ क्या कर रहे हैं इसका एक नमूना पोस्ट कर सकते हैं? मैं कुछ चुनौतियों के माध्यम से संघर्ष कर रहा हूं, और मैं इसे एक साथ टुकड़े करने के लिए काफी उज्ज्वल नहीं हूं। –

संबंधित मुद्दे