2013-02-27 187 views
10

मुझे एक ओवरलोडेड __get ($ अनुक्रमणिका) विधि का मज़ाक करने में समस्या है। के लिए वर्ग मज़ाक उड़ाया जा करने के लिए कोड और परीक्षण के अंतर्गत प्रणाली है कि यह इस प्रकार है की खपत: इस प्रकारPHPUnit: __get() में परिणाम "__get() में परिणाम वास्तव में 1 तर्क लेना चाहिए ..."

<?php 
class ToBeMocked 
{ 
    protected $vars = array(); 

    public function __get($index) 
    { 
     if (isset($this->vars[$index])) { 
      return $this->vars[$index]; 
     } else { 
      return NULL; 
     } 
    } 
} 

class SUTclass 
{ 
    protected $mocky; 

    public function __construct(ToBeMocked $mocky) 
    { 
     $this->mocky = $mocky; 
    } 

    public function getSnack() 
    { 
     return $this->mocky->snack; 
    } 
} 

टेस्ट दिखता है:

<?php  
class GetSnackTest extends PHPUnit_Framework_TestCase 
{ 
    protected $stub; 
    protected $sut; 

    public function setUp() 
    { 
     $mock = $this->getMockBuilder('ToBeMocked') 
        ->setMethods(array('__get') 
        ->getMock(); 

     $sut = new SUTclass($mock); 
    } 

    /** 
    * @test 
    */ 
    public function shouldReturnSnickers() 
    { 
     $this->mock->expects($this->once()) 
        ->method('__get') 
        ->will($this->returnValue('snickers'); 

     $this->assertEquals('snickers', $this->sut->getSnack()); 
    } 
} 

रियल कोड थोड़ा और अधिक जटिल है, हालांकि ज्यादा नहीं, अपने माता-पिता वर्ग में "getSnacks()" है। लेकिन यह उदाहरण पर्याप्त होना चाहिए।

समस्या मैं निम्नलिखित त्रुटि मिलती है, जब PHPUnit के साथ परीक्षण को क्रियान्वित:

Fatal error: Method Mock_ToBeMocked_12345672f::__get() must take exactly 1 argument in /usr/share/php/PHPUnit/Framework/MockObject/Generator.php(231) 

जब मैं मैं भी परीक्षा पद्धति नहीं पहुँच सकते हैं डिबग। ऐसा लगता है कि यह नकली वस्तु को स्थापित करने में टूट जाता है।

कोई विचार?

+0

ठीक है, मैंने थोड़ा और परीक्षण किया। वास्तव में मॉक क्लास के निर्माण में समस्या प्रतीत होती है। यदि मैं इसे -> setMethods (सरणी ('blabla') के साथ बना देता हूं) वह परीक्षण विधियों तक पहुंच जाता है। अगर मैं -> setMethods (सरणी ('__ get') का उपयोग करता हूं तो वह टूट जाता है। – beToiba

+0

आप सही हैं - समस्या यह है कि पीएचपी मॉक ऑब्जेक्ट्स कैसे नकली उत्पन्न कर रहा है - नीचे दिए गए उत्तर में से कोई भी इसका समाधान नहीं करता है। मुझे यह समस्या PHPUnit 4.0 में मिल रही है - आप किस संस्करण का उपयोग कर रहे हैं? – HorusKol

+0

मैंने PHPUnit के संस्करणों के विभिन्न संयोजनों के साथ इसे फिर से बनाने की कोशिश की है और यह नवीनतम संस्करण से उपलब्ध मॉक ऑब्जेक्ट निर्भरता (लेखन के समय 4.8.2) PHPUnit 3.5 पर वापस ले जाया गया है, और इसे मेरे तरीके से तोड़ने के लिए नहीं मिल सकता पर्यावरण - उबंटू 12.04.5 एलटीएस पर PHP 5.5। जब तक मूल पोस्टर इस प्रश्न पर विस्तार नहीं कर सकता है, तो वे जिन संस्करणों का उपयोग कर रहे थे, उनके संयोजन को याद करते हुए, मैं अनुशंसा करता हूं कि यह प्रश्न बंद हो। – Benjamin

उत्तर

0

आप returnCallback बजाय returnValue साथ यह कोशिश कर सकते:

$this->mock->expects($this->once()) 
    ->method('__get') 
    ->will($this->returnCallback(array($this, 'callbackMethod'))); 

कौन सा तो मापदंडों __get बुलाया गया था के साथ विधि callbackMethod कॉल करेंगे।

आपका कॉलबैक विधि कुछ ऐसा दिखाई दे सकता है:

public function callbackMethod() 
{ 
    return 'snickers'; 
} 

देखें: तो तुम एक के साथ नकली उपलब्ध कराने की आवश्यकता http://www.phpunit.de/manual/3.5/en/test-doubles.html#test-doubles.stubs.examples.StubTest5.php

+1

संकेत के लिए धन्यवाद, लेकिन यह समस्या प्रतीत नहीं होती है। यह वास्तव में नकली निर्माण बिंदु पर प्रतीत होता है। – beToiba

+0

बढ़िया, बिल्कुल मुझे क्या चाहिए! –

-1

__get(), एक तर्क लेता है:

/** 
* @test 
*/ 
public function shouldReturnSnickers() 
{ 
    $this->mock->expects($this->once()) 
       ->method('__get') 
       ->with($this->equalTo('snack')) 
       ->will($this->returnValue('snickers'); 

    $this->assertEquals('snickers', $this->sut->getSnack()); 
} 

with() विधि PHPUnit में मॉक किए गए विधि के लिए तर्क सेट करता है। आप Test Doubles पर अनुभाग में अधिक जानकारी प्राप्त कर सकते हैं।

+0

'()' कॉल को शामिल करने के लिए मुझे यह ठीक करने की उम्मीद है, लेकिन यह मेरे लिए नहीं है (PHPUnit 4.4)। क्या आपने इसे देने से पहले * इस उत्तर का परीक्षण किया था? बस सोच रहा है कि क्या आप बस दस्तावेज़ों को पुन: व्यवस्थित कर रहे हैं, या इसे काम करने के लिए जानते हैं? –

+0

मुझे लगता है कि मैं उस समय 3.7 का उपयोग कर रहा था। यह (या ऐसा कुछ) काम करता है, लेकिन जब मैं इसे लिखता हूं तो मुझे वह संदर्भ नहीं मिल रहा था जिसे मैं संदर्भित कर रहा था। लेकिन नहीं, मैंने इस कोड का परीक्षण किया। – mAAdhaTTah

+0

चीयर्स। मुझे कुछ डाफ्ट करना होगा (एक PHP नौसिखिया का थोड़ा सा) –

-1

withAnyParameters() विधि आप मदद कर सकते हैं, यह सही काम करता है: मज़ाक उड़ाया जादू विधि __get में

$this->mock -> expects($this -> once()) 
    -> method('__get') -> withAnyParameters() 
    -> will($this -> returnValue('snikers')); 
0

देखो। शायद आप वहां से एक और __get विधि को कॉल करें और सही ढंग से मॉक ऑब्जेक्ट नहीं।