Ho iniziato a scrivere alcuni test unitari per il mio progetto attuale. Non ho davvero esperienza con esso però. Prima voglio "capirlo" completamente, quindi attualmente non sto usando né il mio framework IoC né una libreria beffarda.
Mi chiedevo se ci fosse qualcosa di sbagliato nel fornire argomenti nulli ai costruttori di oggetti nei test unitari. Lasciami fornire un codice di esempio:
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){...}
}
Ancora un altro esempio di codice auto (TM), ridotto solo alle parti importanti per la domanda. Ora ho scritto un test simile a questo:
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));
}
}
Il test funziona bene. SpeedLimit
ha bisogno di un Car
con un Motor
per fare la sua cosa. Non è affatto interessato a CarRadio
a, quindi ho fornito null per quello.
Mi chiedo se un oggetto che fornisce la corretta funzionalità senza essere completamente costruito sia una violazione di SRP o un odore di codice. Ho questa fastidiosa sensazione che lo faccia, ma speedLimit.IsViolatedBy(motor)
non mi sento bene - un limite di velocità viene violato da un'auto, non da un motore. Forse ho solo bisogno di una prospettiva diversa per i test unitari rispetto al codice di lavoro, perché l'intera intenzione è testare solo una parte del tutto.
Costruire oggetti con null in unit test è un odore di codice?
null
radio, il limite di velocità è calcolato correttamente. Ora potresti voler creare un test per convalidare il limite di velocità con una radio; nel caso in cui il comportamento differisca ...
Motor
probabilmente non dovrebbe averespeed
affatto. Dovrebbe avere unthrottle
e calcolare un intorque
base all'attualerpm
ethrottle
. È compito della macchina usare unTransmission
per integrarlo in una velocità attuale e trasformarlo in unrpm
segnale per tornare alMotor
... Ma immagino, non eri in esso per il realismo comunque, vero?