2013-02-12 48 views
5

मैं माता पिता विधि मजाक के साथ समस्या है, इस उदाहरण है:PHPUnit नकली माता पिता विधि

class PathProvider 
{ 
    public function getPath() 
    { 
     return isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/'; 
    } 
} 


class Uri extends PathProvider 
{ 
    public function getParam($param) 
    { 
     $path = $this->getPath(); 

     if ($path == $param) 
      return 'OK'; 
     else 
      return 'Bad'; 
    } 
} 

और अब मैं नकली विधि getPath (चाहते हैं), और कॉल विधि getParam() जो मज़ाक उड़ाया मूल्य recive।

$mock = $this->getMock('PathProvider'); 

$mock->expects($this->any()) 
->method('getPath') 
->will($this->returnValue('/panel2.0/user/index/id/5')); 

मैं इस भाग को लिख रहा था, लेकिन मुझे नहीं पता कि मुझे विधि के परीक्षण के लिए इस नकली मूल्य को कैसे पारित करना होगा।

+2

मुझे लगता है कि एक नया स्वरूप हो सकता है क्रम में, एक उरी एक PathProvider नहीं है, यह सिर्फ अपनी सेवाओं की जरूरत है। – GordonM

+0

@ गॉर्डनएम पूरी तरह से सही है! आपको पथप्रोवाइडर को निर्भरता के रूप में बनाना चाहिए और इसे उरी कक्षा (नियंत्रक या बसने के माध्यम से) के अंदर इंजेक्ट करना चाहिए। अनैतिकता का उपयोग न करें – Cyprian

उत्तर

5

आपको सिर्फ नकली Uri कक्षा की आवश्यकता है। तुम्हें पता है, केवल एक ही विधि (getPath) नकली कर सकते हैं कि जैसे:

$sut = $this->getMock('Appropriate\Namespace\Uri', array('getPath')); 

$sut->expects($this->any()) 
    ->method('getPath') 
    ->will($this->returnValue('/panel2.0/user/index/id/5')); 

और फिर हमेशा की तरह अपना वस्तु का परीक्षण कर सकते हैं:

$this->assertEquals($expectedParam, $sut->getParam('someParam')); 
+0

जब मैं आपके जैसे विधि को कॉल करता हूं तो मुझे त्रुटि मिलती है: 'अपरिभाषित विधि पर कॉल करें Mock_Uri_b1cf6492 :: getParam() ' –

+0

शायद आप getMock विधि प्राप्त करने के लिए उपयुक्त नेमस्पेस जोड़ना भूल गए हैं। ऊपर दिए गए मेरे उदाहरण को देखें (मैं जवाब संपादित करूंगा) – Cyprian

+0

मेरे ऐप में, मेरे पास सही नेमस्पेस है, लेकिन मुझे हमेशा ऊपर की तरह त्रुटि है। –

4

मेरे और मेरे दोस्त पुस्तकालय मजाक की तरह mockito लिखें। ouzo-goddies#mocking

$mock = Mock::create('\Appropriate\Namespace\Uri'); 
Mock::when($mock)->getPath()->thenReturn(result);