Unit tests sobre métodos protegidos y privados

Posted by victor on March 31st, 2013
unit-testsLos test sobre las clases que escribimos son unas de las herramientas más importantes que poseemos como desarrolladores. Gracias a ellos, certificamos que todo funciona tal y como esperamos. Incluso puede llegar a ser mejor práctica crear los test antes de escribir cualquier código, tal y como indica la metodología Test-driven Development o TDD por el acrónimo que forma. Testar a los métodos y propiedades públicas son las tereas habituales y en PHP se suelen realizar con PhpUnit. El problema es que en algunas ocasiones, necesitamos comprobar que los métodos privados o protegidos funcionan correctamente y es en estos casos donde encontramos una barrera. Para eliminar esta barrera necesitamos hacer uso de la API de reflexión que ofrece PHP 5 y para facilitarnos el trabajo, existe un proyecto en GitHub que aprovecha el concepto de función amiga de C++, aquella función que era externa a una clase pero que tenía permisos para acceder a métodos privados y protegidos.

¿Cómo usar la librería?

Estas funciones amigas forman parte del proyecto PhpTools y su uso es sencillo. Lo mejor, como siempre, un ejemplo:
class MiClase {
    private $varPrivada = 'privada';

    private function funcionPrivada() {
        return 'función privada';
    }
}

$miClase = new MiClase();

echo $miClase->varPrivada;  // Genera un "fatal error
// --> Cannot access private property MiClase::$varPrivada"

echo $miClase->funcionPrivada();  // Genera un "fatal error
// --> Call to private method MiClase::funcionPrivada()"

$friend = new Friend($miClase);

echo $friend->funcionPrivada();  // $> función privada
echo $friend->varPrivada;        // $> privada

$friend->varPrivada = 'nuevo valor';
echo $friend->varPrivada;        // $> nuevo valor
Gracias a la clase Friend creamos un envoltorio que nos permite acceder a funciones y variables privadas. Para evitar conflictos con los nombres de métodos propios de nuestra clase, Friend solo expone métodos mágicos y algunos métodos con el prefijo __friend. Ahora, ya podemos usar cualquier assert de PhpUnit.   GitHub: PhpTools.

Comments

comments powered by Disqus