que es un poco hacky, pero me gusta usar esta directiva de compilación condicional:
{$IfNDef TEST}
private
{$EndIf}
Su proyecto de prueba de unidad debe definir PRUEBA en project → conditional defines
.
Sin una especificación de visibilidad, se publican. Cuidado: si la visibilidad privada no es la primera en la declaración de clase, obtendrá la definición anterior.Una forma más segura, pero más detallado y menos claro, sería:
private
{$IfDef TEST}
public
{$EndIf}
Esto tiene algunas ventajas con respecto a la creación de subclases u otros enfoques:
- ninguna complejidad adicional: no hay clases adicionales en el código
- Nadie puede subclasificar y anular "erróneamente" su clase: conserva su arquitectura
- Cuando dice que un método está protegido, de alguna manera espera que se anule. Usted está diciendo esto para quién está leyendo su código. Un método protegido que no debe ser anulado confundirá a los lectores de su código, rompiendo mi primer principio de programación: "el código debe escribirse para ser leído por otros seres humanos".
- DUnit está en su propia unidad, no se incluye en todas partes
- No toca el sucio RTTI.
Creo que es una solución más clara y mejor que la respuesta seleccionada.
Cuando uso esto, también configuro el proyecto de prueba para colocar los objetos de compilación en un directorio diferente del proyecto principal. Esto evita que los binarios con la directiva TEST se mezclen con el otro código.
Vea también: [¿Cuál es la forma correcta de probar una clase con métodos privados utilizando JUnit?] (Http://stackoverflow.com/questions/34571/whats-the-proper-way-to-test-a-class -with-private-methods-using-junit) – mjn
Otra opción http://stackoverflow.com/questions/7525071/accesing-a-strict-private-field-using-the-rtti – sav
Posible duplicado de [¿Cómo puedo probar? una clase que tiene métodos privados, campos o clases internas?] (https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that-has-private-methods-fields-or- inner-classes) – Raedwald