2012-04-03 6 views
9

मेरी n00b सर्वर का हिस्सा:सी # में Faking टीसीपी अनुरोध

TcpClient client = tcpListener.AcceptTcpClient(); 
Thread clientThread = new Thread(new ParameterizedThreadStart(handleClientRegistration)); 
clientThread.Start(client); 
... 
//and in the clientThread we wait for data 
bytesRead = clientStream.Read(message, 0, 4096); 

अब मैं इस झलकी के लिए इकाई परीक्षण लिखने के लिए करना चाहते हैं। मैं एक ग्राहक कनेक्शन नकली बनाना चाहता हूं, मनमाना डेटा पास करना चाहता हूं और जांचता हूं कि सर्वर इसे कैसे संभालता है।

मुझे इसे सी # में कैसे करना चाहिए?

संपादित करें:
मैं जो मैक करना चाहता हूं वह कनेक्शन ही है - मैं नेटवर्क कनेक्शन से बचना चाहता हूं।

+0

मुझे लगता है कि आपको वास्तव में सॉकेट पर कनेक्ट करना होगा ...? हो सकता है कि मैं आपका प्रश्न खो रहा हूं, लेकिन बस एक और सॉकेट खोलें, कनेक्ट करें, और कुछ डेटा भेजें ...? – Aerik

+0

यह वही है जो इस सवाल के बारे में है: क्या मुझे सॉकेट खोलना चाहिए, या मुझे पूरे टीसीपी इंटरफेस का नकल करना चाहिए। मुझे लगता है कि एक उचित परीक्षण नेटवर्क संसाधन जैसे सीमित संसाधन का उपयोग नहीं करना चाहिए .. या मैं गलत हूँ। – emesx

उत्तर

16

यदि यह सॉकेट सुन रहा है तो यह इकाई परीक्षण नहीं है। क्लाइंट को लपेटें और पतली परत के साथ और नकली के साथ काम करें। इस तरह आप नकली सभी प्राप्त डेटा नकली कर सकते हैं।

उदा। सॉकेट मजाक (सरलीकृत उदाहरण):

सभी तरीकों के साथ एक अंतरफलक ISocket बनाएं आप की जरूरत:

public interface ISocket 
{ 
    ISocket Accept(int port); 
    byte[] Receive(int numberOfBytes); 
    bool Send(byte[] data); 
    void Disconnect(); 
    bool Connect(string address, int port); 
} 

अब एक ठोस वर्ग TcpSocket ISocket को लागू बनाने के लिए:

public class TcpSocket : ISocket 
{ 
    private Socket socket; 
    public TcpSocket() 
    { 
     socket = new Socket(AddressFamily.InterNetwork, 
          SocketType.Stream, ProtocolType.Tcp); 
    } 

    // implement all methods of ISocket by delegating to the internal socket 
} 

जहाँ भी आप सामान्य System.Net.Sockets.Socket का उपयोग करें, इसके बजाए एक आईसॉकेट पास करें। जब आपको सॉकेट का उपयोग TcpSocket का उपयोग करने की आवश्यकता होती है। यदि आप अपने सिस्टम की गड़बड़ी में गहरे नीचे सॉकेट बनाते हैं तो आप सीधे टीसीपी सॉकेट को नए बनाने के बजाए एक कारखाना बनाना चाहते हैं। परीक्षण के तहत आप आईएसओकेट (मॉक) (संभावित रूप से फैक्ट्री के माध्यम से बनाए गए) के एक अलग कार्यान्वयन को पारित कर सकते हैं। आप मास्कसेट नामक आईसॉकेट का दूसरा कार्यान्वयन करके अपना खुद का नकली कार्यान्वित कर सकते हैं जो प्राप्त करने में परीक्षण डेटा देता है या आप अनगिनत नकली ढांचे पर आपके लिए ऐसा करने के लिए उपयोग कर सकते हैं।

public class MockSocket : ISocket 
{ 
    private byte[] testData; 
    public void SetTestData(byte[] data) 
    { 
     testData = data; 
    } 

    public byte[] Receive(int numberOfBytes) 
    { 
     return testData; 
    } 

    // you need to implement all members of ISocket ofcourse... 
} 

यह हो सकता है प्रयास का एक बहुत की तरह देखा है, लेकिन सभी लेकिन खिलौना प्रणालियों में सीमा एपीआई एक पतली परत के परीक्षण के लिए न केवल, लेकिन यह भी लचीला रहने के लिए के पीछे छिपा दिया जाना चाहिए। उदाहरण के लिए, यदि आप System.Net.Socket की बजाय एक अधिक शक्तिशाली सॉकेट लाइब्रेरी का उपयोग करना चाहते हैं तो आप अपने कोड में सॉकेट के हर उपयोग को बदलने की आवश्यकता के बिना टीसीपी सॉकेट का उपयोग कर सकते हैं। यह भी कारण है कि एक ठोस कार्यान्वयन के लिए प्रोग्रामिंग के बजाय एक इंटरफ़ेस प्रोग्रामिंग आमतौर पर एक अच्छा विचार है: आप आसानी से कार्यान्वयन स्विच कर सकते हैं (लेकिन इसका मतलब यह नहीं है कि आपको अपने सभी वर्गों में इंटरफेस बनाना चाहिए)। यदि यह सब आपको मजाक करने के बारे में अधिक पढ़ता है (जैसे यहां: http://en.wikipedia.org/wiki/Mock_object)

+2

यह –

+0

ठीक है जाने का तरीका है। मेरे पास एक टीसीपी सर्वर है - धागे, टीसीपी कनेक्शन के लिए सुनना। और मेरे पास एक क्लाइंट है - सर्वर के साथ संचार। अब मैं अलग से परीक्षण कर रहा हूं, तो मुझे वास्तव में क्या करना चाहिए .. ग्राहक? क्यों .. क्योंकि मैं इसे किसी भी डेटा को भेजने के लिए मजबूर कर सकता हूं। मैं टीसीपी इंटरफेस का मज़ाक उड़ाते हुए सी # के बारे में और सोच रहा था इसलिए कोई ट्रैफिक उत्पन्न नहीं हुआ आदि। अधिक मेमोरी शैली .. – emesx

+0

आपको टीसीपी क्लाइंट क्लास का नकल करना चाहिए। – EricSchaefer

3

सबसे आसान तरीका यह होगा कि Stream पर एक ऐसा तरीका हो और जो भी आप संचालन कर रहे हैं उसे निष्पादित करें। इस तरह आप बस MemoryStream पास कर सकते हैं जिसमें उस डेटा को आप चाहते हैं। यह आपके क्लाइंट प्रारंभिक कोड का परीक्षण करने में मदद नहीं करेगा, लेकिन यह स्पष्ट नहीं था कि यह आपके लिए महत्वपूर्ण था या नहीं।

इसके अलावा, प्रति ग्राहक Thread शुरू न करें, Task या इसके बजाय एक समान कार्यप्रणाली का उपयोग करें।

+0

टिप के लिए धन्यवाद! – emesx

2

यूनिट-टेस्ट करने के लिए, आपको शायद .NET TCP API के शीर्ष पर अमूर्तता की एक परत बनाने की आवश्यकता होगी। यूनिट परीक्षण आमतौर पर आपके कोड के इनपुट, आउटपुट और इंटरैक्शन का परीक्षण करने के लिए होते हैं - अन्य एपीआई के साथ आपके कोड की बातचीत का परीक्षण करने के लिए नहीं। यह एकीकरण परीक्षण की भूमिका है। आपके द्वारा बनाए गए अमूर्त परत की इकाई इकाई परीक्षण नहीं की जाएगी, लेकिन यह आपके शेष कोड का परीक्षण करने के लिए इसे नकली या नकली वस्तु के साथ आसानी से स्वैप करने की अनुमति देगी।

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