Supongamos que tengo una rutina privada que realiza alguna cálculo:¿Cómo probar la unidad de código privado sin refactorizar para separar la clase?
private function TCar.Speed: float
{
Result = m_furlogs * 23;
}
Pero ahora quiero empezar a probar este cálculo más a fondo, así que refactorizar a una función separada:
public function TCar.Speed: float
{
Result = CalculateSpeed(m_furlogs);
}
private function TCar.CalculateSpeed(single furlogs): float
{
Result = furlogs * 23;
}
Ahora i puede realizar todo tipo de pruebas en CalculateSpeed
:
Check(CalculateSpeed(0) = 0);
Check(CalculateSpeed(1) = 23);
Check(CalculateSpeed(2) = 46);
Check(CalculateSpeed(88) = -1);
Excepto que no puedo realizar estas pruebas, porque CalculateSpeed
es privado a TCar
. Un tenant abstracto de pruebas unitarias es que nunca se prueba el código privado, solo las interfaces públicas. Como cuestión práctica, la unidad * x * normalmente no está estructurada para poder acceder a métodos privados de la clase separada que se está probando.
El problema es que ninguna parte del resto de la clase está configurada para manejar pruebas unitarias. Esta es la primera rutina que tendrá pruebas de cualquier tipo. Y es muy difícil configurar la clase de host un conjunto de condiciones iniciales que me permitirán probar llamar a CalculateSpeed
con cada conjunto de entradas que me gustaría.
La única alternativa que puedo ver, se está moviendo este cálculo privada fuera en su propia clase TCarCalculateSpeed
:
public class TCarCalculateSpeed
{
public function CalculateSpeed(float furlogs)
{
Result = furlogs * 23;
}
}
toda una clase, dedicada a la exposición de un método, que se supone que es privado, sólo para poder ¿Pruébalo?
Explosión de clase.
Además, es privado. Si quisiera que fuera público, preferiría promocionarlo a público visibilidad - al menos de esa manera guardo una clase separada que se está creando.
me gustaría agregar algunas pruebas de unidad; pero solo se puede hacer en pequeños fragmentos, a medida que cambia el código. No puedo rediseñar por completo el software de 12 años de funcionamiento, posiblemente rompiendo todo, porque quería probar un cálculo interno.
Mi actual, el mejor, el pensamiento es añadir un método Test
a mi clase Car
, y acaba de llamar que:
TCar Car = new TCar();
Car.RunTests;
public procedure TCar.RunTests
{
Check(CalculateSpeed(0) = 0);
Check(CalculateSpeed(1) = 23);
Check(CalculateSpeed(2) = 46);
Check(CalculateSpeed(88) = -1);
}
Pero ahora tengo que encontrar la manera de tener TCar.RunTests
conseguir trigged por el TestRunner
externa , que solo está diseñado para usar las clases TestCase
.
Nota: He intentado con todo mi corazón mezclar la sintaxis de varios idiomas. En otras palabras: idioma agnóstico.
No sé cómo hacerlo de una manera independiente del idioma, pero en VS/.NET, creará una clase de Accessor, que sombrea tu clase real y hace todo público para que puedas probarlo. – CaffGeek
Esa podría ser la respuesta que tengo disponible. Tendría que hacer el método 'protected', en lugar de' private', pero luego puedo acceder a los miembros protegidos desde mi archivo de código de prueba de unidad. –