sobrecarga overload metodos method magicos example __tostring __call php symfony phpunit magic-methods

overload - ¿Es posible, utilizando objetos simulados de PHPUnit, esperar una llamada a un método magic__call()?



phpunit example (1)

getMock() PHPUnit toma un segundo argumento, una matriz con los nombres de los métodos que se burlarán. Si incluye un nombre de método en esta matriz, el objeto simulado contendrá un método con ese nombre, en el que expects() que expects() y amigos) trabajen.

Esto aplica incluso para métodos que no están definidos en la clase "real", por lo que algo como lo siguiente debería ser el truco:

$mockPageRepository = $this->getMock(''PageRepository'', array(''findOneBySlug''));

Tenga en cuenta que deberá incluir explícitamente otros métodos que también deban burlarse, ya que solo los métodos nombrados en la matriz se definen para el objeto simulado.

Tengo un objeto simulado en una prueba. El objeto real, PageRepository, implementa un método mágico utilizando __call (), por lo que si llama $ pageRepository-> findOneByXXXX ($ value_of_field_XXXX), buscará en la base de datos los registros que coincidan con ese parámetro.

¿Hay alguna manera de burlarse de ese método?

La llamada al método real se vería así:

$homepage = $pageRepository->findOneBySlug(''homepage'');

La prueba se vería así:

$mockPageRepository->expects($this->any()) ->method(''findOneBySlug'') ->will($this->returnValue(new Page()));

Pero no funciona: PHPUnit no detecta la llamada al método. La única forma de que vea el método es definir explícitamente el método en PageRepository.