Para objetos que componen otro objeto como parte de su implementación, ¿cuál es la mejor manera de escribir la prueba unitaria para que solo se pruebe el objeto principal? ejemplo trivial:Prueba de objetos con dependencias en PHPUnit
class myObj {
public function doSomethingWhichIsLogged()
{
// ...
$logger = new logger('/tmp/log.txt');
$logger->info('some message');
// ...
}
}
Sé que el objeto podría ser diseñado de manera que se podría inyectar la dependencia de los objetos registrador y por lo tanto se burló en una prueba de unidad, pero eso no es siempre el caso - en los escenarios más complicados, sí es necesario para componer otros objetos o hacer llamadas a métodos estáticos.
Como no queremos probar el objeto logger, solo el myObj, ¿cómo procedemos? ¿Creamos un "doble" trozado con el guión de prueba? Algo así como:
class logger
{
public function __construct($filepath) {}
public function info($message) {}
}
class TestMyObj extends PHPUnit_Framework_TestCase
{
// ...
}
Esto parece factible para objetos pequeños, pero sería un dolor para las API más complicados donde el SUT dependía de los valores de retorno. Además, ¿qué sucede si desea probar las llamadas al objeto de dependencia de la misma manera que con los objetos simulados? ¿Hay alguna forma de burlarse de los objetos que son instanciados por el SUT en lugar de ser pasados?
He leído la página del manual en los simulacros, pero no parece cubrir esta situación en la que la dependencia se compone en lugar de agregarse. ¿Cómo lo haces?
¿Has mirado en PHPUnit que introdujo las dependencias de la prueba y por lo tanto accesorio reutilizar desde 3.4? http://sebastian-bergmann.de/archives/848-Fixture-Reuse-in-PHPUnit-3.4.html Cheers Markus –