php unit-testing mocking phpunit

PHPUnit: métodos de código auxiliar no definidos



unit-testing mocking (2)

Debo estar perdiendo algo. Estoy tratando de aplastar métodos en una clase en PHPUnit, pero cuando invoco el método en el objeto simulado, me dice que el método no está definido.

Ejemplo de clase a stub:

namespace MyApp; class MyStubClass { public function mrMethod() { // doing stuff } }

Para aplastarlo, escribo:

// specifying all getMock() args to disable calling of class __construct() $stub = $this->getMock(''MyStubClass'', array(), array(), ''MockMyStubClass'', false, false, false); $stub->expects($this->any()) ->method(''mrMethod'') ->will($this->returnValue(''doing stuff''));

Pero al invocar el método aplastado, obtengo una excepción:

$stub->mrMethod(); //PHP Fatal error: Call to undefined method MockMyStubClass::mrMethod()

Estoy usando PHPUnit 3.4.3 con PHP 5.3.0.

Otra pequeña cosa que noté fue que si la especificación de un espacio de nombres en el método getMock() produce una excepción de carga de clase debido a un doble espacio de nombres:

$stub = $this->getMock(''MyApp/MyStubClass''); // Fatal error: Class ''MyApp/MyApp/MyStubClass'' not found

Eso me parece bastante extraño (y getmock () no aceptará un espacio de nombres con una barra invertida inicial). ¿Lo único en lo que podría pensar es porque esta clase está registrada con un autocargador?

¿Alguna idea?


Respondiendo a mi propia pregunta:

Después de un poco de frustración, logré que las cosas funcionaran. No estoy seguro de cuál era el problema, pero descubrí algunas cosas que podrían ayudar a otros:

  • Asegúrese de que está ejecutando la última versión de PHPUnit (3.4.6 a partir de este escrito)
  • Utilice el espacio de nombres completamente calificado menos la primera barra invertida.

    $this->getMock(''MyApp/Widgets/WidgetFactory'');

Parte de mi problema era que PHPUnit estaba creando una clase de código auxiliar WidgetFactory que no estaba realmente aplastando MyApp/Widgets/WidgetFactory . Uno esperaría que se produjera una excepción si se intentara aplastar una clase inexistente, pero no parece ocurrir con la confusión del espacio de nombres.

Además, hay una pregunta here que sugiere usar el método de alias de clase de la siguiente manera:

class_alias(''MyApp/Widgets/WidgetFactory'', ''WidgetFactory''); $this->getMock(''WidgetFactory'');

Si bien esto resolvió temporalmente mi problema, recomendaría encarecidamente que no lo use. class_alias() no se puede llamar dos veces para el mismo alias sin generar una excepción, lo que causa un problema obvio si se usa en el método setup() , o como parte de la generación de stub.


Tuve un problema similar, mi problema era que la ruta que estaba escribiendo era algo como MyApp/Widgets/WidgetFactory/MyStubClass mientras que la clase era algo como esto:

namespace MyApp; class MyStubclass { public function mrMethod() { // doing stuff } }

Así que no estaba la C mayúscula en el nombre de la clase en la ruta