2011-09-15 12 views
33

जब मैं एक नया मॉक बनाता हूं तो मुझे उम्मीद विधि को कॉल करने की आवश्यकता होती है। यह वास्तव में क्या करता है? इसके तर्कों के बारे में क्या?PHPUnit: विधि का अनुमान है

$todoListMock = $this->getMock('\Model\Todo_List'); 
     $todoListMock->expects($this->any()) 
      ->method('getItems') 
      ->will($this->returnValue(array($itemMock))); 

मुझे कहीं भी कारण नहीं मिला (मैंने दस्तावेज़ों की कोशिश की है)। मैंने सूत्रों को पढ़ा है लेकिन मैं इसे समझ नहीं पा रहा हूं। धन्यवाद।

उत्तर

37

उम्मीद() - सेट आप कितनी बार उम्मीद एक विधि के नाम से जाना:

$mock = $this->getMock('nameOfTheClass', array('firstMethod','secondMethod','thirdMethod')); 
$mock->expects($this->once()) 
    ->method('firstMethod') 
    ->will($this->returnValue('value')); 
$mock->expects($this->once()) 
    ->method('secondMethod') 
    ->will($this->returnValue('value')); 
$mock->expects($this->once()) 
    ->method('thirdMethod') 
    ->will($this->returnValue('value')); 

यदि आप जानते हैं, कि विधि एक बार $ इस- का उपयोग कहा जाता है > एक बार() को उम्मीद है (में), अन्यथा $ this-> किसी भी()

देखने का उपयोग करें:
PHPUnit mock with multiple expects() calls

https://phpunit.de/manual/current/en/test-doubles.html#test-doubles.stubs

http://www.slideshare.net/mjlivelyjr/advanced-phpunit-testing

+1

क्या होता है अगर इसे एक बार बुलाया जाता है, और फिर, फिर से बुलाया जाता है? – thom

+0

यदि विधि को एक बार बुलाया जाने वाला तरीका अधिक बार कहा जाएगा, तो परीक्षण शायद –

+12

न केवल * संभव *, लेकिन * निश्चित रूप से *; – Gordon

41

एक स्रोत कोड पर गौर आपको बता देंगे:

/** 
* Registers a new expectation in the mock object and returns the match 
* object which can be infused with further details. 
* 
* @param PHPUnit_Framework_MockObject_Matcher_Invocation $matcher 
* @return PHPUnit_Framework_MockObject_Builder_InvocationMocker 
*/ 
public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher); 

और PHPUnit मैनुअल

  • किसी भी समय उपलब्ध matchers सूचीबद्ध करता है () एक मैचर लौटाता है जो उस विधि से मेल खाता है जब मूल्यांकन के लिए शून्य या अधिक बार निष्पादित किया जाता है।
  • कभी नहीं() एक मैचर लौटाता है जो उस विधि से मेल खाता है जब इसका मूल्यांकन किया जाता है, जिसे कभी भी निष्पादित नहीं किया जाता है।
  • atLeastOnce() एक मैचर लौटाता है जो उस विधि से मेल खाता है जब इसे कम से कम एक बार निष्पादित किया जाता है।
  • एक बार() एक मैचर लौटाता है जो उस विधि से मेल खाता है जब इसका मूल्यांकन किया जाता है, ठीक उसी समय निष्पादित किया जाता है।
  • बिल्कुल (int $ count) एक मैचर लौटाता है जो उस विधि से मेल खाता है जब मूल्यांकन के लिए जिस विधि का मूल्यांकन किया जाता है उसे ठीक से $ गिनती के समय निष्पादित किया जाता है।
  • पर (int $ अनुक्रमणिका) एक मैचर लौटाता है जो उस विधि से मेल खाता है जब मूल्यांकन के लिए जिस विधि का मूल्यांकन किया जाता है उसे दिया गया है।
+1

नोट() 0. पर शुरू होता है पर मैं के माध्यम से कुछ परीक्षण और त्रुटि आज मुश्किल तरीके से बाहर है कि पाया गया कि। – PressingOnAlways

+3

यह भी ध्यान दें कि '() 'आपके मॉक ऑब्जेक्ट पर सभी स्टब किए गए विधि के लिए एक ही काउंटर का उपयोग करता है। यह प्रत्येक विधि के लिए एक नया काउंटर असाइन नहीं करता है। – ankr