Comencé a escribir algunas pruebas unitarias para mi proyecto actual. Aunque realmente no tengo experiencia con eso. Primero quiero "obtenerlo" por completo, por lo que actualmente no estoy usando mi marco de trabajo IoC ni una biblioteca de imitación.
Me preguntaba si hay algo malo en proporcionar argumentos nulos a los constructores de objetos en las pruebas unitarias. Permítanme proporcionar un código de ejemplo:
public class CarRadio
{...}
public class Motor
{
public void SetSpeed(float speed){...}
}
public class Car
{
public Car(CarRadio carRadio, Motor motor){...}
}
public class SpeedLimit
{
public bool IsViolatedBy(Car car){...}
}
Otro ejemplo de código de automóvil (TM), reducido a solo las partes importantes para la pregunta. Ahora escribí una prueba algo como esto:
public class SpeedLimitTest
{
public void TestSpeedLimit()
{
Motor motor = new Motor();
motor.SetSpeed(10f);
Car car = new Car(null, motor);
SpeedLimit speedLimit = new SpeedLimit();
Assert.IsTrue(speedLimit.IsViolatedBy(car));
}
}
La prueba funciona bien. SpeedLimitnecesita un Carcon un Motorpara hacer lo suyo. No está interesado en CarRadioabsoluto, así que proporcioné nulo para eso.
Me pregunto si un objeto que proporciona la funcionalidad correcta sin estar completamente construido es una violación de SRP o un olor a código. Tengo la sensación persistente de que sí, pero speedLimit.IsViolatedBy(motor)tampoco me parece bien: un automóvil, no un motor, viola un límite de velocidad. Tal vez solo necesito una perspectiva diferente para las pruebas unitarias en comparación con el código de trabajo, porque toda la intención es probar solo una parte del todo.
¿Construir objetos con nulos en pruebas unitarias huele a código?
nullradio, el límite de velocidad se calcula correctamente. Ahora es posible que desee crear una prueba para validar el límite de velocidad con una radio; por si el comportamiento difiere ...
Motorprobablemente no debería tener ningunospeed. Debe tenerthrottleay calcular a entorquefunción de la corrienterpmythrottle. Es el trabajo del automóvil usar unTransmissionpara integrar eso en una velocidad actual, y convertirlo en unarpmseñal de retorno aMotor... Pero supongo que de todos modos no estabas en el realismo, ¿verdad?