2012-02-03 17 views
7

मैं वर्तमान में एक Socket वर्ग, जो मूल रूप से PHP के socket_* कार्यों के लिए सिर्फ एक OO आवरण वर्ग है:मैं PHPUnit के साथ यूनिट परीक्षण सॉकेट कोड कैसे करूं?

class Socket { 
    public function __construct(...) { 
     $this->_resource = socket_create(...); 
    } 

    public function send($data) { 
     socket_send($this->_resource, $data, ...); 
    } 

    ... 
} 

मुझे नहीं लगता कि जब से मैं PHP के सॉकेट कार्यों का उपयोग कर रहा मैं सॉकेट संसाधन नकली कर सकते हैं करते हैं, इसलिए फिलहाल मैं इस कक्षा का विश्वसनीय रूप से परीक्षण करने के तरीके के रूप में अटक गया हूं।

+0

बाहर जहाँ तक मेरा छोड़े गए भागों '...' महत्वपूर्ण – KingCrunch

+0

@KingCrunch देख सकते हैं सोच के लिए एक इनाम देने पर विचार: वे इसमें महत्वपूर्ण हैं कि वे वही हैं जो मैं परीक्षण करना चाहता हूं, लेकिन मेरे प्रश्न के लिए महत्वहीन नहीं है। चूंकि 'socket_ *' फ़ंक्शन सॉकेट संसाधनों पर निर्भर हैं (जो AFAIK को मजाक नहीं किया जा सकता है), मैं इन तरीकों का विश्वसनीय रूप से परीक्षण नहीं कर सकता। – FtDRbwLXw6

+0

मेरे पास सामान्य रूप से यूनिट परीक्षण नेटवर्किंग कोड पर कुछ राय हैं, लेकिन मेरे पास PHP के साथ शून्य अनुभव है। यदि आपको PHP डेवलपर्स से कुछ दिनों में कोई जवाब नहीं मिलता है, तो मैं कुछ टिप्पणियां तब लिखूंगा। यह उपयोगी होगा यदि आपने कुछ सॉकेट क्लास का उपयोग करने वाले कोड को पोस्ट किया है, क्योंकि यह संभवतः मेरे उत्तर में फैलाएगा। – selbie

उत्तर

16

आप इकाई परीक्षण मानसिकता में एक छोटा सा टुकड़ा गायब दिखते हैं।

आपकी समस्या एक स्टब ऑब्जेक्ट बनाकर आसानी से हल करने योग्य है। आश्चर्यजनक रूप से, मैं इस जवाब का समय और समय फिर से देता हूं, इसलिए इसे बहुत से लोगों द्वारा काफी हद तक याद किया जाना चाहिए।

क्योंकि मैं स्टब्स और mocks के बीच मतभेद के रूप में इतना भ्रम देखते हैं, मुझे इसे यहाँ से बाहर रखना है, साथ ही करते हैं ...

  • एक नकली एक वर्ग है कि एक और फैली हुई होती है कक्षा कि परीक्षा परीक्षण परीक्षण करने के लिए उस वर्ग के व्यवहार को बदलने के लिए सीधे निर्भर पर है।
  • एक ठूंठ एक वर्ग है कि एक API या इंटरफ़ेस * कि एक परीक्षण आसानी से अपने दम पर सीधे परीक्षण नहीं कर सकते, आदेश परीक्षण संभव बनाने के लिए लागू करता है।

^- यह मैंने कभी पढ़ा है दोनों का स्पष्ट वर्णन है; मुझे इसे अपनी साइट पर रखना चाहिए।

सॉकेट्स में यह अच्छी सुविधा है जहां आप परीक्षण उद्देश्यों के लिए पोर्ट 0 से बांध सकते हैं (गंभीरता से, इसे "क्षणिक बंदरगाह" कहा जाता है)।

तो यह प्रयास करें:

class ListeningServerStub 
{ 
    protected $client; 

    public function listen() 
    { 
     $sock = socket_create(AF_INET, SOCK_STREAM, 0); 

     // Bind the socket to an address/port 
     socket_bind($sock, 'localhost', 0) or throw new RuntimeException('Could not bind to address'); 

     // Start listening for connections 
     socket_listen($sock); 

     // Accept incoming requests and handle them as child processes. 
     $this->client = socket_accept($sock); 
    } 

    public function read() 
    { 
     // Read the input from the client – 1024 bytes 
     $input = socket_read($client, 1024); 
     return $input; 
    } 
} 

इस वस्तु बना सकते हैं और यह सेट अपने परीक्षण के setUp() में सुनने और सुनने को रोकने और tearDown() में इसे नष्ट करने के लिए। फिर, अपने परीक्षण में, अपने नकली सर्वर से कनेक्ट करें, डेटा को read() फ़ंक्शन के माध्यम से वापस प्राप्त करें, और इसका परीक्षण करें।

यह आप बाहर एक बहुत मदद करता है, तो मुझे पारंपरिक बॉक्स ;-)

+0

मुझे नहीं लगता कि आप मेरे प्रश्न को समझ गए हैं। शायद यह स्पष्ट नहीं होने के लिए मेरी गलती है (यदि हां, तो मुझे बताएं कि मैं इसे बेहतर बनाने के लिए कैसे संशोधित कर सकता हूं)। जिस कोड को मैं परीक्षण करना चाहता हूं *** *** है, सर्वर है, इसलिए सर्वर को दबाकर मेरी मदद नहीं होगी। न ही क्लाइंट को दबाएगा, क्योंकि जैसा कि मैंने बताया, यहां तक ​​कि स्टब बाहरी संसाधन पर निर्भर करेगा (यूनिट परीक्षण फाइल सिस्टम कोड की तरह)। – FtDRbwLXw6

+0

मुझे यह और अधिक स्पष्ट करने का अनुमान है: यदि मैं क्लाइंट को स्टब करता हूं तो क्या होता है, लेकिन फ़ायरवॉल चयनित पोर्ट पर नेट ट्रैफ़िक को अवरुद्ध कर रहा है। या कुछ PHP सेटिंग सॉकेट खोलने की अनुमति देता है। या हम रूट के बिना सिस्टम पर पोर्ट <1024 चुनते हैं। ऐसी कई चीजें हैं जो संभावित रूप से परीक्षण विफल होने का कारण बन सकती हैं जब कोड गलती नहीं होता है, और यह अविश्वसनीय परीक्षण के लिए बनाता है। – FtDRbwLXw6

+0

@drrcknlsn अगर आप एक सर्वर का परीक्षण करने वाले यूनिट की सहायता करना चाहते हैं जो आपकी सॉकेट क्लास का हिस्सा नहीं है, तो आप यूनिट परीक्षण के बारे में क्या है ** के बारे में ** बहुत उलझन में हैं। यदि आप किसी सर्वर का परीक्षण करना चाहते हैं, तो बस क्लाइंट को स्कब करने के लिए स्विच करें (जाहिर है!)। यदि उपरोक्त में से कोई भी नहीं, न केवल प्रश्न खराब था, लेकिन मैं पूरी तरह उलझन में हूं, उह। –

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