2010-11-21 5 views
8

Estoy usando PHPUnit para mis pruebas de unidad Estoy utilizando un objeto de prueba para probar si se llama a un método con los parámetros correctos. Esto funciona bien cuando solo quiero hacer esto una vez.¿Cómo puedo probar si se llama al mismo método con los parámetros correctos con PHPUnit y el objeto falso

$logMock = $this->getMockBuilder('Logger') 
      ->disableOriginalConstructor() 
      ->getMock(); 

    //check if it updates the correct record 
    $logMock->expects($this->exactly(1)) 
      ->method('updateLog') 
      ->with(456, 'some status'); 

ahora tengo la situación que quiero poner a prueba si el updateLog se llama una segunda vez (con diferentes parámetros). No veo cómo puedo hacer esto con el método 'con'.

¿Alguien tiene alguna sugerencia?

Respuesta

13

No conozco su marco de burla. Por lo general, solo creas otra expectativa. Supongo que también debería funcionar con este marco.

$logMock->expects($this->exactly(1)) 
     ->method('updateLog') 
     ->with(100, 'something else'); 

Editar

Parece que el marco PHPUnit no soporta múltiples expectativas diferentes sobre el mismo método. De acuerdo con esto site tiene que usar la funcionalidad del índice.

Sería el siguiente aspecto

$logMock->expects($this->at(0)) 
     ->method('updateLog') 
     ->with(456, 'some status'); 
$logMock->expects($this->at(1)) 
     ->method('updateLog') 
     ->with(100, 'something else'); 
$logMock->expects($this->exactly(2)) 
     ->method('updateLog'); 
+0

Estoy usando las capacidades de simulación interna de PHPUnit. Dentro de mi aplicación (el método que está siendo prueba) la updateLog se llama dos veces, así que no puede poner a prueba los argumentos del método con diferentes expectativas. – Fino

+0

Según este sitio se puede lograr esto mediante el uso de la funcionalidad de llamada-índice. http://www.kreamer.org/phpunit-cookbook/1.0/mocks/set-mock-expectations-for-multiple-calls-to-a-function – treze

+0

Gracias! El $ this-> at (index) hace el trabajo. También gracias por el enlace al sitio web, alguna información útil. – Fino

1

La respuesta anterior es correcta.

puede encontrar la respuesta en el manual de PHPUnit http://www.phpunit.de/manual/3.6/en/phpunit-book.html#test-doubles.mock-objects.tables.matchers búsqueda de matchers. comparadores son las clases devueltos por las funciones de cualquier(), ni(), etc ... el que necesita es la PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex, devuelto por el método al()

usted puede encontrar más navegando clases PHPUnit (ADD a la ruta del proyecto y use un IDE como netbeans para saltar a ellos y ver lo que puede usar)

1

A partir de PHPUnit 4.2, puede usar la aserción withConsecutive. Siempre que sepa el orden de las llamadas. Su maqueta se vería así:

$logMock->expects($this->exactly(2)) 
     ->method('updateLog') 
     ->withConsecutive(
      array(456, 'some status') 
      array(100, 'something else') 
     ); 
0

returnCallback

Si no puede utilizar withConsecutive(), posiblemente debido a que están en una versión antigua de PHPUnit, usted tiene otra opción con returnCallback.

La función returnCallback se invoca cada vez que se invoca su método de prueba. Esto significa que puede guardar los argumentos que se le pasan para una inspección posterior. Por ejemplo:

$actualArgs = array(); 

$mockDependency->expects($this->any()) 
    ->method('setOption') 
    ->will($this->returnCallback(
     function($option, $value) use (&$actualArgs){ 
      $actualArgs[] = array($option, $value); 
     } 
    )); 

$serviceUnderTest->executeMethodUnderTest(); 

$this->assertEquals(
    array(
     array('first arg of first call', 'second arg of first call'), 
     array('first arg of second call', 'second arg of second call'), 
    ), 
    $actualArgs); 
Cuestiones relacionadas