2012-02-15 13 views
13

Dado el siguiente método:PHPUnit: cómo probar si se llama a la devolución de llamada?

public function foo($callback) { 
    call_user_func($callback); 
} 

¿Cómo iba a probar que la devolución de llamada en realidad nos llama, utilizando PHPUnit? El método foo() no tiene valor de retorno. Su único trabajo es ejecutar una devolución de llamada dada a él, con algunas otras búsquedas y misc. procesamiento que he omitido por simplicidad.

que hemos probado algo como esto:

public method testFoo() { 
    $test = $this; 
    $this->obj->foo(function() use ($test) { 
     $test->pass(); 
    }); 
    $this->fail(); 
} 

... pero al parecer no hay pass() método, por lo que este no funciona.

Respuesta

14

Para probar si se invocó o no algo, debe crear un mock test double y configurarlo para que se le llame N número de veces.

Aquí es una solución para la devolución de llamada utilizando un objeto (no probado):

public method testFoo() { 
    $test = $this; 

    $mock = $this->getMock('stdClass', array('myCallBack')); 
    $mock->expects($this->once()) 
    ->method('myCallBack') 
    ->will($this->returnValue(true)); 

    $this->obj->foo(array($mock, 'myCallBack')); 
} 

PHPUnit fallará automáticamente la prueba si no se invoca $mock->myCallBack(), o invocado más de una vez.

He utilizado stdClass y su método myCallBack() porque no estoy seguro de si puede simular funciones globales como la de su ejemplo. Podría estar equivocado acerca de eso.

+0

Gracias! Esto funciona genial Dejé fuera la llamada 'will()', ya que la devolución de llamada en realidad no necesita hacer nada. – FtDRbwLXw6

6

Puede hacer que su devolución de llamada establezca una variable local y afirmar que se configuró.

public function testFoo() { 
    $called = false; 
    $this->obj->foo(function() use (&$called) { 
     $called = true; 
    }); 
    self::assertTrue($called, 'Callback should be called'); 
} 
+0

Muy simple y efectivo. ¡Gracias! – marcellorvalle

Cuestiones relacionadas