A la hora de hacer los unit
testing, tarde o temprano nos llega indefectiblemente la pregunta: ¿cómo
testeo un método privado?
El asunto en cuestión es
motivo de distintos puntos de vista, opiniones, y discusiones. Sin embargo
basado un poco en la experiencia personal y la ajena, más un poco de
literatura, ofrezco mi punto de vista.
Existen dos opiniones
diferentes al respecto: unos dicen que los métodos privados no deben testearse,
y otros que si. Ah, y bueno, están los grises que dicen que "depende de la
situación". Yo me incluyo en este último grupo. La ingeniería de software
es una ciencia muy "gris" todavía.
La cruda realidad, es que
con muchos de los frameworks no podemos testear métodos privados, por la simple
razón de que son privados y no podemos acceder a ellos. (No lo dije antes, pero
doy por hecho que los tests se encuentran en un proyecto aparte de aquel que
contiene el código que estamos testeando y por eso no podemos accederlos).
Los que dicen que no deben
testearse métodos privados, tienen sus razones. Principalmente sostienen que
solo debe testearse la interfaz de, pongámosle, una clase. Es decir, todos
aquellos métodos públicos que sirven de interfaz al mundo exterior (los
programadores que utilizan estos métodos). Y que a su vez, los métodos privados
son solo "ayudantes" de los métodos públicos. Estos pueden cambiar
con mayor frecuencia que los métodos públicos, y por tanto, una eventual
modificación de los métodos privados que no debiera alterar los resultados de
los métodos públicos, podría hacer fallar los tests que testean los métodos
privados. Es decir que se cambió el comportamiento interno sin alterar el
comportamiento externo y que, por lo tanto, solo debemos preocuparnos por
testear el comportamiento externo.
Yo no estoy precisamente de
acuerdo con este punto de vista. Si queremos testear el método, deberíamos
poder. La realidad es que así nomás no se puede. Entonces salen alguna
alternativas que voy a mencionar, y me alegraría siempre de escuchar o leer
nuevas.
1) Mover los métodos
privados a una nueva clase.
Si el/los método/s privados
que queremos testear lo ameritan, los refactorizamos creando una -o más-
nueva clase que solo los contenga a ellos -pero como métodos públicos- y
no formen parte de la interfaz de nuestra clase. De esta forma seguirán
estando "ocultos" hacia el mundo exterior (porque no pertenecen a la
interfaz), y sin embargo ya podemos accederlos tranquilamente desde el proyecto
de testing.
2) Convertir los
métodos privados en públicos.
No soy un gran entusiasta
de esta opción. Creo que si un método se pensó privado, privado debe
permanecer. Si se cambia a público, la razón debería tener que ver con
otras cuestiones y no con el testing. Pero ya dicho, es una opción más.
3) Convertir los métodos
en internal.
Desconozco si existe en
otros lenguajes el equivalente a internal de C#. Con esto permitimos que
las clases dentro del mismo ensamblado se puedan ver. Sin embargo, fuera del
ensamblado siguen permaneciendo ocultas. Y debemos especificar a qué ensamblado
le damos visibilidad (con [assembly:InternalsVisibleTo("MyTests")]).
Cuando puede utilizarse,
soy partidario de la tercera forma, ya que es bastante más limpia. En otro
caso, habrá que evaluar qué hacer, o incluso si coincidir con quienes dicen que
los métodos privados no tiene estrictamente que testearse.
Hasta pronto!
No hay comentarios:
Publicar un comentario
Comments are subject to moderation, only in order to avoid insults and disguising things.
Los comentarios están sujetos a moderación, solo con el fin de evitar insultos y cosas por el estilo.