यह बहुत महत्वपूर्ण है जब इकाई परीक्षण परीक्षण से बचने के लिए कार्यान्वयन विवरण है। इसके बजाय, आप अपने कोड के केवल सार्वजनिक इंटरफ़ेस का परीक्षण करने के लिए स्वयं को सीमित करना चाहते हैं। क्यूं कर? क्योंकि कार्यान्वयन विवरण अक्सर बदलते हैं, लेकिन आपकी एपीआई बहुत ही कम होनी चाहिए। परीक्षण कार्यान्वयन विवरण का अर्थ है कि आपको अपने परीक्षणों को फिर से लिखना होगा क्योंकि उन कार्यान्वयन में परिवर्तन होता है, और आप इसे करने में फंसना नहीं चाहते हैं।
तो ओपी के कोड के लिए इसका क्या अर्थ है? आइए सार्वजनिक Pager::next
विधि देखें। कोड जो Pager
वर्ग एपीआई परवाह नहीं करताPager::next
निर्धारित करता है कि कोई अपवाद फेंक दिया जाना चाहिए या नहीं। यह केवल परवाह करता है कि Pager::next
वास्तव में कुछ गलत होने पर अपवाद फेंकता है।
हम यह जांचना नहीं चाहते कि OutOfBoundsException
फेंकने के फैसले पर विधि कैसे आती है - यह एक कार्यान्वयन विस्तार है। हम केवल यह जांचना चाहते हैं कि उचित होने पर ऐसा होता है।
तो इस परिदृश्य का परीक्षण करने के लिए हम एक ऐसी स्थिति का अनुकरण करते हैं जिसमें Pager::next
फेंक देगा। इसे पूरा करने के लिए हम बस "परीक्षण सीम" कहलाते हैं। ...
<?php
class Pager
{
protected $i;
public function next()
{
if ($this->isValid()) {
$this->i++;
} else {
throw new OutOfBoundsException();
}
}
protected function isValid() {
return $this->i < 3;
}
}
उपरोक्त कोड में, संरक्षित Pager::isValid
विधि हमारे परीक्षण सीवन है। यह हमारे कोड (इसलिए नाम) में एक सीम का खुलासा करता है जिसे हम परीक्षण उद्देश्यों के लिए देख सकते हैं।परीक्षण है कि Pager::next
$i
का अमान्य मान के लिए एक अपवाद फेंकता है, हमारे नए परीक्षण सीवन और PHPUnit के मजाक API का उपयोग करना मामूली बात है:
class PagerTest extends PHPUnit_Framework_TestCase
{
/**
* @covers Pager::next
* @expectedException OutOfBoundsException
*/
public function testNextThrowsExceptionOnInvalidIncrementValue() {
$pagerMock = $this->getMock('Pager', array('isValid'));
$pagerMock->expects($this->once())
->method('isValid')
->will($this->returnValue(false));
$pagerMock->next();
}
}
सूचना कैसे इस परीक्षण विशेष रूप से परवाह नहीं करता कैसे कार्यान्वयन विधि Pager::isValid
निर्धारित करता है कि वर्तमान वृद्धि अवैध है। यह परीक्षण केवल false
को वापस आने के लिए विधि को झुकाता है ताकि हम यह जांच सकें कि हमारे सार्वजनिक Pager::next
विधि ऐसा करने पर अपवाद फेंकता है।
PHPUnit mocking API पूरी तरह से Test Doubles section of the PHPUnit manual में शामिल है। एपीआई दुनिया के इतिहास में सबसे सहज ज्ञान नहीं है, लेकिन कुछ बार-बार उपयोग के साथ यह आम तौर पर समझ में आता है।
@PeeHaa - ऐसा लगता है कि आप 'phpunit' टैग को याद करते हैं। मुझे लगता है कि सवाल यह है कि कैसे * इकाई परीक्षण * है कि अपवाद तीसरे कॉल पर होता है। – Spudley