Ich habe angefangen, Unit-Tests für mein aktuelles Projekt zu schreiben. Ich habe allerdings keine wirkliche Erfahrung damit. Ich möchte es zuerst vollständig "bekommen", daher verwende ich derzeit weder mein IoC-Framework noch eine Spottbibliothek.
Ich habe mich gefragt, ob irgendetwas falsch daran ist, den Konstruktoren von Objekten in Komponententests Nullargumente zu liefern. Lassen Sie mich einen Beispielcode bereitstellen:
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){...}
}
Noch ein weiteres Car Code Example (TM), reduziert auf die für die Frage wichtigen Teile. Ich habe jetzt einen Test geschrieben, der ungefähr so aussieht:
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));
}
}
Der Test läuft gut. SpeedLimit
braucht a Car
mit a Motor
um sein ding zu machen. Es ist überhaupt nicht daran interessiert CarRadio
, also habe ich null dafür angegeben.
Ich frage mich, ob ein Objekt, das die korrekte Funktionalität bietet, ohne vollständig konstruiert zu sein, eine Verletzung der SRP oder einen Codegeruch darstellt. Ich habe das quälende Gefühl, dass dies der Fall ist, aber ich speedLimit.IsViolatedBy(motor)
fühle mich auch nicht richtig - ein Tempolimit wird von einem Auto verletzt, nicht von einem Motor. Vielleicht brauche ich nur eine andere Perspektive für Unit-Tests im Vergleich zum Arbeitscode, weil die gesamte Absicht darin besteht, nur einen Teil des Ganzen zu testen.
Ist das Konstruieren von Objekten mit Null in Unit-Tests ein Codegeruch?
null
Radio das Tempolimit korrekt berechnet wird. Jetzt möchten Sie möglicherweise einen Test erstellen, um die Geschwindigkeitsbegrenzung mit einem Funkgerät zu überprüfen . Nur für den Fall, dass sich das Verhalten unterscheidet ...
Motor
wohl gar kein habenspeed
. Es sollte einthrottle
und eintorque
basierend auf dem aktuellenrpm
und berechnenthrottle
. Es ist die Aufgabe des Autos, a zu verwendenTransmission
, um dies in eine aktuelle Geschwindigkeit zu integrieren, und um dies in einrpm
Signal zurück zumMotor
... zu verwandeln. Aber ich denke, Sie waren sowieso nicht für den Realismus dabei, oder?