2011-05-26 11 views
7

कॉल करता है मैं यूनिट को बिजनेस लेयर विधि का परीक्षण कैसे करूं जो डब्ल्यूसीएफ सेवा को कॉल करता है?यूनिट परीक्षण एक विधि है जो डब्ल्यूसीएफ सेवा

उदाहरण:

public void SendData(DataUnit dataUnit) 
{ 

     //this is WCF call 
     SomeServiceClient svc = new SomeServiceClient(); 

     svc.SomeMethod(dataUnit); 

} 

वहाँ एक रास्ता मैं अपने यूनिट परीक्षण परियोजना में SomeServiceClient नकली कर सकते हैं?

+0

क्या मैं इन मामलों करना Moq उपयोग करने के लिए करने के लिए सेवा इंटरफ़ेस उपहास करने के लिए:, सेवा कॉल कर एक TestThing में पारित अगर आप सिर्फ एक परीक्षण चलाना चाहते हैं करना चाहते हैं। – Yaur

+1

यहां डब्ल्यूसीएफ के बारे में कुछ खास नहीं है (हालांकि तथ्य यह है कि क्लाइंट क्लास एक इंटरफ़ेस लागू करता है) आपकी मदद कर सकता है। कुछ वर्ग लाइब्रेरी विधि को कॉल करने के लिए 'SendData' की आवश्यकता होने पर यह वही समस्या होगी। –

+0

@ यकुर: मैं न्यूट फ्रेमवर्क कैसे कहूं कि अगर कुछ सेवा क्लाइंट कहा जाता है, तो इस मॉक ऑब्जेक्ट का उपयोग करें। चूंकि कुछ सर्विस क्लाइंट बीएल के अंदर बनाया गया है, इसलिए मुझे नहीं पता कि मैं इसे कैसे पास करूं। – Asdfg

उत्तर

12

आपकी समस्या यह है कि आपने अपनी डब्ल्यूसीएफ सेवा में अपने बिजनेस लेयर को कसकर जोड़ दिया है - आप वास्तव में बिजनेस लेयर के भीतर सेवा क्लाइंट का एक नया उदाहरण बनाते हैं, जिसका अर्थ है कि बिना कॉल किए भेजें SendData विधि को कॉल करना असंभव है सेवा विधियों।

यहां सबसे अच्छा समाधान आपके आर्किटेक्चर पर निर्भरता इंजेक्शन पेश करना है।

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

public class BusinessClass 
{ 
    private ISomeServiceClient _svc; 

    public BusinessClass(ISomeServiceClient svc) 
    { 
     _svc = svc; 
    } 

    public void SendData(DataUnit dataUnit) 
    { 
     _svc.SomeMethod(dataUnit); 
    } 
} 

ध्यान दें कि कोड से ऊपर, एक डिजाइन पैटर्न है नियंत्रण कंटेनर के किसी उलट जैसे किसी भी ढांचे पर बिल्कुल कोई निर्भरता के साथ।

यदि आपकी कंपनी की नीति ऐसी ढांचे (रास्ते में पागल नीति) का उपयोग न करने के लिए है, तो भी आप अपने यूनिट परीक्षणों के अंदर सेवा के अपने नकली उदाहरण मैन्युअल रूप से इंजेक्ट कर सकते हैं।

+0

परियोजना में निर्भरता ढांचे का उपयोग नहीं कर सकते हैं। कंपनी की नीति। :( – Asdfg

+7

एक आर्किटेक्चरल पैटर्न और डीआई फ्रेमवर्क या आईओसी कंटेनर के उपयोग के रूप में निर्भरता इंजेक्शन के बीच एक अंतर है। –

+0

बहुत अच्छा जवाब। मैं वास्तव में आपकी मदद की सराहना करता हूं। – Asdfg

1

आप अपने व्यापार परत से आपकी सेवा कॉल पृथक करना चाहिए: एक RealThing अगर आप में

public void SendData(IMyInterface myInterface, DataUnit dataUnit) 
{ 

     myInterface.SomeMethod(dataUnit); 

} 

पास:

नीचे डेमो का उपयोग करना, अपने व्यापार परत विधि है कि आप सूचीबद्ध अब इस प्रकार दिखाई देगा

public interface IMyInterface 
{ 
    void SomeMethod(DataUnit x); 
} 

public class RealThing : IMyInterface 
{ 
    public void SomeMethod(DataUnit x) 
    { 
     SomeServiceClient svc = new SomeServiceClient(); 
     svc.SomeMethod(x); 
    } 
} 

public class TestThing : IMyInterface 
{ 
    public void SomeMethod(DataUnit x) 
    { 
     // do your test here 
    } 
} 
+0

क्या यह मुझे दो स्थानों पर कुछ विधि लागू नहीं करेगा? अगर मैं रीयलटिंग क्लास में कुछ बदलना, मुझे अपने टेस्ट टिंगिंग के कुछ तरीके में एक ही चीज़ आना और बदलना पड़ सकता है। क्या मुझे यह गलत लगता है? – Asdfg

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