2011-12-23 13 views
12

का उपयोग कर वस्तुओं का परीक्षण मैं एक वर्ग है कि एक अंतरफलक के वारिस होगा लिख ​​रहा हूँ। क्लाइंट कोड उस इंटरफ़ेस के लिए लिखा जाएगा, और इसका समर्थन करने के लिए लिखी गई कक्षा। विचार यह है कि मैं बाद में उस इंटरफ़ेस के लिए अन्य कक्षाएं लिखूंगा, और उन दो अलग-अलग वर्गों की वस्तुओं को पूरी तरह से विनिमय करने योग्य होना चाहिए। उस प्रथम श्रेणी के लिए एक टेस्ट क्लास लिखने के बजाय, मैं इंटरफ़ेस के लिए एक लिखना चाहता हूं।PHPUnit - एक अंतरफलक के लिए एक परीक्षण वर्ग लेखन, और एक कारखाने

मेरे योजना एक परीक्षण वर्ग है कि निर्माता (निर्भरता इंजेक्शन) के लिए एक कारखाने वस्तु ले जाएगा, और परीक्षण के अंतर्गत वर्ग के नए उदाहरण बना करने के लिए कारखाने का उपयोग लिखने के लिए किया गया था।

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

लेकिन के बारे में क्या निर्माता का परीक्षण? क्या मैं एक अमूर्त टेस्ट क्लास लिखने और उन वर्गों में कन्स्ट्रक्टर परीक्षणों को लागू करने के लिए बेहतर हूं जो सार परीक्षण कक्षा का उत्तराधिकारी हैं (विभिन्न वर्गों को अलग-अलग तत्काल किया जा सकता है)?

अगर मैं पहला विचार, मुझे लगता है मैं प्रत्येक वर्ग परीक्षण किया जा रहा के लिए एक परीक्षण वर्ग के लिए होता है, की तरह का उपयोग किया था:

class ClassATest extends [PHPUnit test case] 
{ 
    $myFactory = new ClassAFactory(); 
    $myTest = new ClassTest($myFactory); 

    $myTest->test1(); 
    $myTest->test2(); 
    //etc. 
} 

इस बारे में जाने के लिए सबसे अच्छा तरीका क्या है? मैं एक सामान्य परीक्षण के लिए इतना है कि जब मैं आम इंटरफ़ेस को लागू करने के लिए नए वर्गों लिखते हैं, मैं तो बस एक ही परीक्षण दूसरों के लिए इस्तेमाल के रूप में की एक वस्तु डाल सकते हैं चाहता हूँ। लेकिन, अलग-अलग वर्गों के रूप में देखते हुए अलग-अलग रचनाकार होंगे, शायद एक सार परीक्षण कक्षा लिखना और प्रत्येक नई वस्तु के लिए इसे विस्तारित करना बेहतर होगा? तुम क्या सोचते हो?

उत्तर

6

मैं आप अपनी योजना पर पुनर्विचार करने की जरूरत है। आप एक इंटरफ़ेस का परीक्षण नहीं कर सकते हैं और एक अच्छा कारण है - इंटरफ़ेस केवल एपीआई को परिभाषित करता है और कार्यक्षमता नहीं, टेस्ट कार्यक्षमता का परीक्षण करता है। मैं आपको एक उदाहरण देता हूं जो मदद कर सकता है। मान लें कि आपके पास "मैसेजिंग" इंटरफ़ेस है। तो आप एक ईमेल मैसेजर और एक एसएमएस मैसेजर लागू करते हैं। अब आप EmailMessager साथ के रूप में इन अलग से परीक्षण की आवश्यकता आप यकीन है कि यह अपने सामान कर रही है, हो सकता है प्राप्तकर्ता (ईमेल पता) मान्य और संभवतः एक ई वर्ग आदि के लिए भेजने सौंपने जाहिर है जो SMS संदेश अलग होगा बनाने की जरूरत है।

+1

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

+1

नहीं, यह अभी भी समझ में नहीं आता है। ऐसा नहीं है कि मैं काम करने के लिए एक इंटरफेस कैसे समझता हूं। आप सामान्य कोड को लागू करने के लिए इंटरफ़ेस की बजाय सार बेस क्लास चाहते हैं। मुझे यकीन है कि कौन-सा डेटा के अलावा अन्य अपनी कक्षाओं के बारे में अलग है नहीं कर रहा हूँ। – liquorvicar

+0

चलिए कक्षा पर कहते हैं, MailChimpRecipient MailingListRecipient इंटरफ़ेस का उपयोग करता है: क्लाइंट कोडित किसी को प्राप्तकर्ता ऑब्जेक्ट के ईमेल पते और नाम गुणों को सेट करके सूची में जोड़ता है, और फिर उन्हें जोड़ने के लिए एक विधि को कॉल करता है। अब, MailChimp क्लास के लिए यह तरीका MailChimp API को जोड़ने के लिए उपयोग करेगा। भविष्य में कहें, मैं अपनी मेलिंग सूची होस्ट करना चाहता हूं या किसी अन्य प्रदाता का उपयोग करना चाहता हूं, मैं क्लास को किसी अन्य वर्ग के साथ स्विच कर सकता हूं जो मेलिंग लिस्ट रेसिएंट इंटरफ़ेस का उपयोग करता है। वह वर्ग प्राप्तकर्ता को जोड़ने के लिए कुछ पूरी तरह से अलग कर सकता है, लेकिन यह अभी भी वही डेटा लेता है। –

6

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

abstract class IAdderTestCase extends PFTC 
{ 
    function testAdd() { 
     self::assertEquals(5, $this->fixture->add(2, 3)); 
    } 
    ... 
} 

class BasicAdderTest extends IAdderTestCase 
{ 
    function setUp() { 
     $this->fixture = new BasicAdder(); 
    } 
} 

PHPUnit सेटअप() प्रत्येक परीक्षा पद्धति से पहले कॉल करेंगे। इसे प्रत्येक कंक्रीट सबक्लास के साथ सभी विरासत परीक्षण विधियों को किसी भी अतिरिक्त, उदाहरण के लिए कॉल करना चाहिए। रचनाकारों का परीक्षण करने के लिए।

+0

इसके लिए धन्यवाद! ऐसा लगता है कि जाने का सबसे अच्छा तरीका है, क्योंकि मैं प्रत्येक अलग सबक्लास के लिए सेटअप विधि बदल सकता हूं। –

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