2012-04-15 11 views
9

मेरे पास एक साधारण उपयोग केस है।PHPUnit Mock उम्मीदों को बाद में बदलें

$this->myservice 
     ->expects($this->any()) 
     ->method('checkUniqueness') 
     ->will($this->returnValue(true)); 

लेकिन तब में कुछ परीक्षण, मुझे कोई दूसरी मान देने के लिए करना चाहते हैं::

$this->myservice 
     ->expects($this->exactly(1)) 
     ->method('checkUniqueness') 
     ->will($this->returnValue(false)); 

मुझे लगता है मैं एक सेटअप विधि है जो मेरी नकली वस्तु एक डिफ़ॉल्ट मान वापस जाने के लिए कारण होगा करना चाहते हैं अतीत में सी ++ के लिए GoogleMock का उपयोग किया है और इसमें "वापसी ByDefault" या इसे संभालने के लिए कुछ था। मैं यह नहीं समझ सका कि PHPUnit में यह संभव है (कोई एपीआई दस्तावेज नहीं है और मुझे जो चाहिए वह ढूंढने के लिए कोड को पढ़ना मुश्किल है)।

अब मैं $this->myservice को नए मॉक में नहीं बदल सकता, क्योंकि सेटअप में, मैं इसे अन्य चीजों में पास करता हूं जिन्हें मजाक या परीक्षण करने की आवश्यकता होती है।

मेरा एकमात्र अन्य समाधान यह है कि मैं सेटअप का लाभ खो देता हूं और इसके बजाय प्रत्येक परीक्षण के लिए मेरे सभी मोक्स बनाना पड़ता है।

उत्तर

2

आप setUp() कोड को अन्य विधि में ले जा सकते हैं, जिसमें पैरामीटर हैं। इस विधि को तब setUp() से बुलाया जाता है, और आप इसे अपनी टेस्ट विधि से भी कॉल कर सकते हैं, लेकिन डिफ़ॉल्ट वाले पैरामीटर के साथ अलग-अलग पैरामीटर के साथ।

+1

इस मुद्दे को हल कैसे कर सकता है? 'SetUp()' विधि को वैसे भी –

+0

@MassimilianoArione हां कहा जाएगा, लेकिन आप अपना '$ यह-> myservice' फिर से बना सकते हैं और वापसी मूल्य बदल सकते हैं – rndstr

0

setUp() में नकली निर्माण जारी रखें लेकिन प्रत्येक परीक्षा में अलग से अपेक्षा निर्धारित:

class FooTest extends PHPUnit_Framework_TestCase { 
    private $myservice; 
    private $foo; 
    public function setUp(){ 
    $this->myService = $this->getMockBuilder('myservice')->getMock(); 
    $this->foo = new Foo($this->myService); 
    } 


    public function testUniqueThing(){ 
    $this->myservice 
     ->expects($this->any()) 
     ->method('checkUniqueness') 
     ->will($this->returnValue(true)); 

    $this->assertEqual('baz', $this->foo->calculateTheThing()); 
    } 

    public function testNonUniqueThing(){ 
    $this->myservice 
     ->expects($this->any()) 
     ->method('checkUniqueness') 
     ->will($this->returnValue(false)); 

    $this->assertEqual('bar', $this->foo->calculateTheThing()); 

    } 


} 

दो उम्मीदों दूसरे के साथ हस्तक्षेप नहीं करेगा क्योंकि PHPUnit FooTest का एक नया उदाहरण को दर्शाता है प्रत्येक परीक्षा को चलाने के लिए।