2011-09-15 11 views
33

Quando creo una nuova simulazione, devo chiamare il metodo expect. Che cosa fa esattamente? E i suoi argomenti?PHPUnit: prevede metodo

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

non riesco a trovare da nessuna parte la ragione (ho provato docs). Ho letto le fonti ma non riesco a capirlo. Grazie.

risposta

37

aspetta() - Imposta quante volte si aspettano un metodo da chiamare:

$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')); 

Se si sa, che il metodo viene chiamato una volta utilizzare $ this- > una volta() in attesa(), altrimenti usare $ this-> any()

vedere:
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

Cosa succede se viene chiamato una volta e poi richiamato? – thom

+0

se il metodo che si prevede di chiamare una volta verrà chiamato più volte, il test probabilmente non riuscirà a –

+12

non solo * probabilmente *, ma * sicuramente *;) – Gordon

41

uno sguardo al codice sorgente vi dirà:

/** 
* 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); 

e il manuale PHPUnit elenca la disposizione Matchers a

  • qualsiasi () restituisce un matcher che corrisponde quando il metodo per cui è valutato viene eseguito zero o più volte.
  • mai() restituisce un matcher che corrisponde quando il metodo per cui è stato valutato non viene mai eseguito.
  • atLeastOnce() restituisce un matcher che corrisponde quando il metodo viene valutato per viene eseguito almeno una volta.
  • una volta() restituisce un matcher che corrisponde quando il metodo viene valutato per l'esecuzione esattamente una volta.
  • esattamente (int $ count) restituisce un matcher che corrisponde quando il metodo viene valutato per viene eseguito esattamente $ count volte.
  • a (int $ index) restituisce un matcher che corrisponde quando il metodo viene valutato per viene richiamato alla data indice di $.
+1

informa che alle() dalle ore 0. Ho trovato che il modo duro attraverso alcuni tentativi ed errori di oggi. – PressingOnAlways

+3

Si noti inoltre che 'a()' utilizza lo stesso contatore per TUTTO il metodo stub sul proprio oggetto fittizio. NON assegna un nuovo contatore a ciascun metodo. – ankr