J'ai commencé à écrire des tests unitaires pour mon projet actuel. Je n'ai pas vraiment d'expérience avec cela cependant. Je veux d’abord complètement "comprendre", donc je n’utilise actuellement ni mon framework IoC ni une bibliothèque moqueuse.
Je me demandais s'il y avait un problème avec la fourniture d'arguments nuls aux constructeurs des objets dans les tests unitaires. Laissez-moi vous donner un exemple de code:
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){...}
}
Encore un autre exemple de code de voiture (MC), réduit aux seules parties importantes de la question. J'ai maintenant écrit un test qui ressemble à ceci:
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));
}
}
Le test fonctionne bien. SpeedLimit
a besoin d'un Car
avec un Motor
afin de faire sa chose. Cela ne l’intéresse pas CarRadio
du tout, alors j’ai fourni null pour cela.
Je me demande si un objet fournissant une fonctionnalité correcte sans être entièrement construit est une violation de SRP ou une odeur de code. J'ai l'impression que c'est le cas, mais speedLimit.IsViolatedBy(motor)
je ne me sens pas bien non plus: une limite de vitesse est violée par une voiture, pas par un moteur. Peut-être ai-je simplement besoin d'une perspective différente pour les tests unitaires par rapport au code fonctionnel, parce que l'objectif est de tester uniquement une partie du tout.
La construction d'objets avec null dans les tests unitaires a-t-elle une odeur de code?
null
radio, la limite de vitesse est correctement calculée. Maintenant, vous pouvez créer un test pour valider la limite de vitesse avec une radio; juste au cas où le comportement serait différent ...
Motor
ne devrait probablement pas en avoirspeed
du tout. Il devrait avoir unthrottle
et calculer untorque
basé sur le courantrpm
etthrottle
. C’est le travail de la voitureTransmission
d’intégrer cela dans la vitesse actuelle et de transformer cela en unrpm
signal de retour vers leMotor
... Mais je suppose que vous n’avez pas eu le souci de réaliser le réalisme de toute façon, n'est-ce pas?