परीक्षण सार कक्षाएं


144

मैं PHPUnit के साथ एक अमूर्त वर्ग के ठोस तरीकों का परीक्षण कैसे करूं?

मुझे उम्मीद है कि मुझे परीक्षण के भाग के रूप में किसी प्रकार की वस्तु बनानी होगी। हालाँकि, मुझे इसके लिए सबसे अच्छा अभ्यास नहीं पता है या अगर PHPUnit इसके लिए अनुमति देता है।


10
शायद आपको स्वीकृत उत्तर को बदलने पर विचार करना चाहिए।
याकूब

1
शायद stackoverflow.com/a/2947823/23963 मदद करेगा।
निगेल थॉर्न

जवाबों:


240

अमूर्त कक्षाओं की इकाई परीक्षण का मतलब इंटरफ़ेस का परीक्षण करना आवश्यक नहीं है, क्योंकि सार कक्षाओं में ठोस तरीके हो सकते हैं, और इस ठोस तरीकों का परीक्षण किया जा सकता है।

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

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

PHPUnit मैनुअल से सीधे :

abstract class AbstractClass
{
    public function concreteMethod()
    {
        return $this->abstractMethod();
    }

    public abstract function abstractMethod();
}

class AbstractClassTest extends PHPUnit_Framework_TestCase
{
    public function testConcreteMethod()
    {
        $stub = $this->getMockForAbstractClass('AbstractClass');
        $stub->expects($this->any())
             ->method('abstractMethod')
             ->will($this->returnValue(TRUE));

        $this->assertTrue($stub->concreteMethod());
    }
}

नकली वस्तु आपको कई चीजें देती हैं:

  • आपको अमूर्त वर्ग के ठोस कार्यान्वयन की आवश्यकता नहीं है, और इसके बजाय स्टब से दूर हो सकते हैं
  • आप ठोस तरीकों को बुला सकते हैं और दावा कर सकते हैं कि वे सही तरीके से प्रदर्शन करते हैं
  • यदि ठोस विधि असिमित (अमूर्त) विधि से निर्भर करती है, तो आप वापसी मूल्य को इच्छाशक्ति के साथ रोक सकते हैं ()

38

यह एक अच्छा सवाल है। मैं इसके लिए भी देख रहा हूं।
सौभाग्य से, PHPUnit में पहले से ही getMockForAbstractClass()इस मामले के लिए विधि है, उदा

protected function setUp()
{
    $stub = $this->getMockForAbstractClass('Some_Abstract_Class');
    $this->_object = $stub;
}

जरूरी:

ध्यान दें कि इसके लिए PHPUnit> 3.5.4 की आवश्यकता है। पिछले संस्करणों में एक बग था ।

नवीनतम संस्करण में अपग्रेड करने के लिए:

sudo pear channel-update pear.phpunit.de
sudo pear upgrade phpunit/PHPUnit

दिलचस्प लगता है, लेकिन आप मॉक के खिलाफ परीक्षण करेंगे? परीक्षण क्या होंगे? IE: परीक्षण के मामले में मॉक का विस्तार और विस्तारित परीक्षण वर्ग के खिलाफ परीक्षण?
स्टेफोसोसेलिन

34

यह ध्यान दिया जाना चाहिए कि PHP के रूप में अनाम वर्गों के लिए 7 समर्थन जोड़ा गया है। यह आपको एक अमूर्त वर्ग के लिए एक परीक्षण स्थापित करने के लिए एक अतिरिक्त एवेन्यू देता है, एक जो PHPUnit- विशिष्ट कार्यक्षमता पर निर्भर नहीं करता है।

class AbstractClassTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var AbstractClass
     */
    private $testedClass;

    public function setUp()
    {
        $this->testedClass = new class extends AbstractClass {

            protected function abstractMethod()
            {
                // Put a barebones implementation here
            }
        };
    }

    // Put your tests here
}

4
इसके लिए धन्यवाद! PHPUnit में एक अनाम वर्ग का उपयोग करने से मुझे अपने विभिन्न परीक्षणों को बनाने में बहुत लचीलापन मिला।
एलिस वंडर

1

एरन, आपका तरीका काम करना चाहिए, लेकिन यह वास्तविक कोड से पहले परीक्षण लिखने की प्रवृत्ति के खिलाफ जाता है।

मैं जो सुझाव दूंगा, वह यह है कि आप अपने परीक्षण को प्रश्न में अमूर्त वर्ग के एक गैर-अमूर्त उपवर्ग की वांछित कार्यक्षमता पर लिखें, फिर सार वर्ग और कार्यान्वयन उपवर्ग दोनों लिखें, और अंत में परीक्षण चलाएं।

आपके परीक्षणों को स्पष्ट रूप से सार वर्ग के परिभाषित तरीकों का परीक्षण करना चाहिए, लेकिन हमेशा उपवर्ग के माध्यम से।


मुझे एक मनमाना उत्तर मिलता है: आपके पास एक अमूर्त वर्ग 'ए' है जिसमें एक सामान्य 'फू' () पद्धति है। इस 'फू' () 'पद्धति का उपयोग कुल मिलाकर' बी 'और' सी 'कक्षाओं में किया जा रहा है, दोनों' ए 'से प्राप्त होते हैं। आप 'फू' () का परीक्षण करने के लिए किस वर्ग का चयन करेंगे?
14:37 पर user3790897

1

नेल्सन का जवाब गलत है।

सार वर्ग को अपने सभी तरीकों को अमूर्त बनाने की आवश्यकता नहीं है।

कार्यान्वित किए गए तरीके वे हैं जिन्हें हमें परीक्षण करने की आवश्यकता है।

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

चीयर्स।


0

यदि आप अमूर्त वर्ग को उप-वर्ग में विभाजित नहीं करना चाहते हैं, तो केवल उन विधियों पर एक इकाई परीक्षण करें जो पहले से ही अमूर्त वर्ग में लागू हैं, तो आप यह देखने की कोशिश कर सकते हैं कि क्या आपका ढांचा आपको अमूर्त कक्षाओं को मॉक करने की अनुमति देता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.