2011-04-26 23 views
15

Quiero burlarme de un método en la misma clase que estoy probando.Simula un método en la misma clase que se prueba

ClassA { 
    function hardToTest($arg) { 
     // difficult to test code 
    } 

    function underTest() { 
     return $this->hardToTest('foo'); 
    } 
} 

Estaba pensando que podría utilizar la reflexión para hacer esto, pero tal vez es sólo una señal de que debería mover hardToTest en otro objeto.

+0

estoy usando PHPUnit 5.7, y necesitaba usar 'createPartialMock' y especificar qué métodos necesitan ser burlado – Ryan

+0

Estoy de acuerdo en que tener que burlarme de un método en la misma clase que se prueba es el código malicioso, y que el método debe moverse a otra clase. –

Respuesta

15

Esta prueba tendrá éxito si underTest() pasa 'foo' a hardToTest(). Esto se conoce como parcial de simulacro en la documentación de PHPUnit porque se burla solo de algunos de los métodos.

ClassATest { 
    function testUnderTest() { 
     $mock = $this->getMock('ClassA', ['hardToTest']); 
     $mock->expects($this->once()) 
      ->method('hardToTest') 
      ->with('foo'); 
     $mock->underTest(); 
    } 
} 

Estoy de acuerdo con sus instintos que esta necesidad puede ser un olor código que le dice que esta clase está haciendo demasiado.

PHPUnit 5.4+

Desde getMock() está desfasada y en 5.4, utilice getMockBuilder() lugar:

$mock = $this->getMockBuilder('ClassA') 
      ->setMethods(['hardToTest']) 
      ->ge‌​tMock(); 
+2

en realidad debería ser '$ mock = $ this-> getMock ('ClassA', ['hardToTest']);' segundo parámetro de 'getMock' se espera que sea una matriz de nombres de métodos. –

+0

En algunos casos, necesitará hacer un simulacro parcial, por ejemplo, si uno de los métodos de clase realiza una solicitud HTTP. Sería bueno burlarse de ese método y devolver un talón para la solicitud. – b01

+0

ahora que getMock está en desuso, ¿cómo podemos hacer esto? – julestruong

1

¿Cuál es exactamente la razón por la cual el método es difícil de probar?

Si el método está protegido, puede ampliar su ClassA y hacer público el hardToTest($arg).

La conclusión es que no debe modificar la clase solo porque necesita escribir Unittest para ella.

+1

Necesito probar un método que llama a otro método en LA MISMA CLASE. Me gustaría poder simular la funcionalidad de ese método en tiempo de ejecución. Mover el método a otra clase no es mi opción preferida. – james

+1

algo como esto: http://codepad.viper-7.com/v3SA0s –

+0

sí, eso está muy cerca de la idea ... crear una subclase del sistema bajo prueba y anular los métodos relevantes que no quiero prueba. gracias por la ayuda – james

0

Lo que recurrí fue crear una subclase de mi sistema bajo prueba con el método correspondiente apagó.

Cuestiones relacionadas