2010-01-08 12 views
17

Me falta algo. Intento guardar 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.PHPUnit: métodos de código auxiliar undefined

Ejemplo de clase de código auxiliar:

namespace MyApp; 

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

Para stub, lo 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 apagó, me sale una excepción:

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

I 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 los getMock() método da como resultado una excepción de carga de clases a causa de 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() lo hará no acepta un espacio de nombre con una barra diagonal inversa principal). Lo único que podría pensar que podría causar eso podría ser porque esta clase es registrada con un autocargador?

¿Alguna idea?

Respuesta

18

responder a mi propia pregunta:

Después de un poco de frustración, me las arreglé para que todo funcione. No estoy seguro exactamente lo que era el problema, pero lo hizo descubrir algunas cosas que pueden ayudar a los demás:

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

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

Parte de mi problema era que PHPUnit estaba creando una clase stub WidgetFactory que no fue en realidad Stubbing MyApp\Widgets\WidgetFactory. Uno esperaría que ocurriera una excepción si intentase conectar una clase inexistente, pero no parece ocurrir con la confusión del espacio de nombres.

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

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

Si bien esto no resuelve mi problema temporalmente, yo aconsejaría fuertemente contra el uso de la misma. class_alias() no se puede invocar dos veces para el mismo alias sin generar una excepción, que causa un problema obvio si se usa en el método setup(), o como parte de la generación de stub.

+0

Muy útil - no tenía ni idea (al parecer, un poco ingenuo de mí) de que se necesitaba acceder a la clase original para burlarse de ella. –

+0

"Usar el espacio de nombres totalmente calificado menos la primera barra invertida". - Esto es lo que me consiguió :) – Nick

+0

¡esta respuesta es muy útil! Utilicé phpunit 4.8.16, php 5.3. Y abajo está trabajado. '$ stub_obj = $ this-> getMockBuilder ('MyApp \ Controller \ Convert \ MyClass') -> getMock();' – wafe

0

tuve un problema similar, mi problema era que el camino estaba escribiendo era algo así 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 había la C mayúscula en el nombre de la clase en el camino

Cuestiones relacionadas