Si te refieres a privado de la manera en que creo que lo dices en serio, entonces no, no deberías probarlo unitario. Solo debe realizar pruebas unitarias de comportamiento / estado observable. Puede estar perdiendo el punto detrás del ciclo "rojo-verde-refactor" de TDD (y si no está haciendo la prueba primero, entonces se aplica el mismo principio). Una vez que las pruebas se escriben y pasan, no desea que cambien mientras realiza la refactorización. Si se ve obligado a probar la funcionalidad privada de la unidad, entonces probablemente significa que las pruebas unitarias en torno a la funcionalidad pública son defectuosas. Si es difícil y complejo escribir pruebas alrededor del código público, entonces tal vez su clase está haciendo demasiado o su problema no está claramente definido.
Peor aún, con el tiempo sus pruebas unitarias se convertirán en una bola y una cadena que lo ralentizarán sin agregar ningún valor (cambiar la implementación, por ejemplo, la optimización o la eliminación de la duplicación, no debería tener efecto en las pruebas unitarias). Sin embargo, el código interno debe ser probado en la unidad ya que el comportamiento / estado es observable (solo de manera restringida).
Cuando hice la prueba de la unidad por primera vez, hice todo tipo de trucos para probar cosas privadas de la unidad, pero ahora, con algunos años en mi haber, lo veo peor que una pérdida de tiempo.
Aquí hay un ejemplo un poco tonto, por supuesto en la vida real tendrías más pruebas que estas:
Digamos que tiene una clase que devuelve una lista ordenada de cadenas: debe verificar que el resultado esté ordenado, no cómo realmente clasifica esa lista. Puede comenzar su implementación con un algoritmo único que simplemente clasifique la lista. Una vez hecho esto, su prueba no necesita cambiar si luego cambia su algoritmo de clasificación. En este punto, tiene una única prueba (suponiendo que la clasificación esté integrada en su clase):
- ¿Está mi resultado ordenado?
Ahora digamos que desea dos algoritmos (tal vez uno sea más eficiente en algunas circunstancias pero no en otras), entonces cada algoritmo podría (y generalmente debería) ser proporcionado por una clase diferente y su clase elige de ellos; puede verificar que esto esté sucediendo para sus escenarios elegidos utilizando simulacros, pero su prueba original sigue siendo válida y, como solo estamos verificando el comportamiento / estado observable, no necesita cambiar. Terminas con 3 pruebas:
- ¿Está mi resultado ordenado?
- Dado un escenario (digamos que la lista inicial está casi ordenada para empezar), ¿se realiza una llamada a la clase que ordena cadenas usando el algoritmo X?
- Dado un escenario (la lista inicial está en un orden aleatorio), ¿se realiza una llamada a la clase que ordena las cadenas usando el algoritmo Y?
La alternativa hubiera sido comenzar a probar el código privado dentro de su clase (no obtiene nada de esto), las pruebas anteriores me dicen todo lo que necesito saber en lo que respecta a las pruebas unitarias. Al agregar pruebas privadas, está construyendo una camisa de fuerza, ¿cuánto más trabajo sería si no solo verificara que el resultado se clasificó sino también cómo se clasifica?
Las pruebas (de este tipo) solo deberían cambiar cuando el comportamiento cambia, comenzar a escribir pruebas contra el código privado y eso desaparece.