2013-01-09 44 views
5

मुझे "नई एपीआई" (सर्विसस्टैक.ServiceInterface.Service से विरासत) का उपयोग करके सर्विसस्टैक का उपयोग करके बनाए गए कुछ सेवा वर्गों के लिए यूनिट परीक्षण (एनयूनीट का उपयोग करके) लिखने में रूचि है। ऐपहोस्ट का उपयोग करते हुए एएसपी.NET एप्लिकेशन में होस्ट किए जाने पर डीबी प्रॉपर्टी ठीक तरह से ऑटो वायर्ड होती है, लेकिन उस वातावरण के बाहर चलते समय मुझे उचित तकनीक का पता लगाना प्रतीत नहीं होता है। मैं सर्विसस्टैक में विभिन्न परीक्षण-संबंधित नामस्थानों और कक्षाओं को देखता हूं लेकिन एक स्पष्ट उदाहरण नहीं मिल सकता है जहां एक सेवा की डीबी संपत्ति इंजेक्शन दी जा रही है, केवल कनेक्शन फैक्ट्री को सीधे स्थापित करने के विरोध में और फिर विभिन्न आईडीबीकनेक्शन एक्सटेंशन विधियों को कॉल करना (सम्मिलित करना , चयन करें, आदि)।यूनिट परीक्षण ServiceStack.OrmLite एनयूनीट के साथ जब मैं सेवा कक्षाओं में डीबी इंजेक्ट करता हूं?

मैं ServiceStack.ServiceInterface.Testing.TestBase से अपने परीक्षण वर्ग इनहेरिट होने और इसके कॉन्फ़िगर विधि एक IDbConnectionFactory रजिस्टर करने के लिए (का उपयोग करते हुए ": स्मृति:") अधिभावी की कोशिश की है मेरी TestFixtureSetUp में OrmLiteConfig.DialectProvider = SqliteDialect.Provider; स्थापित करने के साथ ही, है, लेकिन मैं जारी रखने के लिए मेरी सेवा विधियों को कॉल करते समय NullReferenceException प्राप्त करने के लिए (ServiceStack.ServiceInterface.Service.get_Db() पर। ऐसा लगता है कि फंक कंटेनर ऑटो-वायरिंग कुछ भी नहीं है।

SQLite ही ठीक से जो मैं सरल इकाई परीक्षण है कि मेरी सेवा कक्षाओं में नहीं जाते और बस प्रत्यक्ष IDbConnection कॉल कर इस बात की पुष्टि करने में सक्षम हूँ की स्थापना की है,।

मुझे क्या याद आ रही है?

संपादित

ऐसा लगता है कि इकाई परीक्षण ServiceStack सेवाओं, हालांकि ऐसा लगता है कि वहाँ क्रमबद्धता लागत (DirectServiceClient उपयोग करने से बचें के लिए सेट अप करने के लिए तरीके हैं, एक मेजबान और एक ग्राहक के अस्तित्व की आवश्यकता है जैसा कि here दिखाया गया है) - हालांकि मैं अपने मामले में काम करने में सफल नहीं हुआ हूं। मैं इसे AppHostHttpListenerBase दृष्टिकोण का उपयोग करके काम करने में कामयाब रहा (देखें here) हालांकि यह इकाई इकाई की तुलना में एकीकरण परीक्षण अधिक है (और तदनुसार धीमा है)।

उत्तर

5

docs on Testing निर्भरता इंजेक्शन के लिए दो अलग-अलग दृष्टिकोण दिखाता है।

आप आधार के लिए कार्यान्वयन को देखें, तो Service यह सिर्फ Db बनाता IDbConnectionFactory से:

private IDbConnection db; 
public virtual IDbConnection Db 
{ 
    get { return db ?? (db = TryResolve<IDbConnectionFactory>().OpenDbConnection()); } 
} 

यह सिर्फ स्थानीय या वैश्विक IResolver आईओसी कंटेनर से हल करता है यही कारण है कि:

public static IResolver GlobalResolver { get; set; } 

private IResolver resolver; 
public virtual IResolver GetResolver() 
{ 
    return resolver ?? GlobalResolver; 
} 

public virtual T TryResolve<T>() 
{ 
    return this.GetResolver() == null 
     ? default(T) 
     : this.GetResolver().TryResolve<T>(); 
} 

तो (जब सेवा आधार वर्ग का प्रयोग करके) अपनी खुद की निर्भरता सुई आप बस अपने निर्भरता अपने servi के साथ एक IAppHost विन्यस्त करने की जरूरत सीईएस की जरूरत है आप कर सकते हैं जिसके साथ:

using (var appHost = new BasicAppHost { 
    ConfigureContainer = c => { 
     c.Register<IDbConnectionFactory>(new ...); 
    } 
}.Init()) 
{ 
    //...  
} 

जो तुम तो अपनी खुद की निर्भरता के किसी भी आपकी सेवा जरूरतों के साथ-साथ आपकी सेवा पर सेट कर सकते हैं, जैसे:

var service = appHost.ResolveService<MyService>(); 

कौन सा सब निर्भरता में विन्यस्त autowire होगा आपका ऐपहोस्ट, आप सामान्य संपत्ति एक्सेस के माध्यम से अपनी खुद की एडमोक टेस्ट-विशिष्ट निर्भरताओं को भी जोड़ सकते हैं, ई।छ:

var service.MyDependency = new Mock<IMyDependency>().Object; 

उसके बाद से आपको सिर्फ फोन और हमेशा की तरह प्रति के रूप में अपने सी # वर्ग तरीकों का परीक्षण कर सकते हैं:

var response = service.Get(new RequestDto { ... }); 
Assert.That(response.Result, Is.Equal("Expected Result from DB")); 
+0

यह पूरी तरह से काम किया! धन्यवाद! मुझे अपने अपेक्षित अपवादों में से एक को रैपर (WebServiceException) से वापस आंतरिक (HttpError) में परिवर्तित करना था, लेकिन यह समझ में आता है कि अब मैं एक सेवा क्लाइंट के माध्यम से नहीं जा रहा हूं। –