Zacząłem pisać testy jednostkowe dla mojego obecnego projektu. Ale tak naprawdę nie mam z tym doświadczenia. Najpierw chcę całkowicie go „zdobyć”, więc obecnie nie używam ani mojego środowiska IoC, ani fałszywej biblioteki.
Zastanawiałem się, czy jest coś złego w podawaniu zerowych argumentów konstruktorom obiektów w testach jednostkowych. Pozwól mi podać przykładowy kod:
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){...}
}
Jeszcze inny przykład kodu samochodu (TM), zredukowany do tylko części ważnych dla pytania. Napisałem test coś takiego:
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));
}
}
Test działa dobrze. SpeedLimit
potrzebuje Car
z Motor
celem, co robi. Nie jest wcale zainteresowany CarRadio
, więc podałem dla tego wartość zerową.
Zastanawiam się, czy obiekt zapewniający poprawną funkcjonalność bez pełnej budowy jest naruszeniem SRP lub zapachem kodu. Mam to dokuczliwe wrażenie, że tak jest, ale speedLimit.IsViolatedBy(motor)
też nie jest w porządku - ograniczenie prędkości jest naruszane przez samochód, a nie przez silnik. Może po prostu potrzebuję innej perspektywy dla testów jednostkowych niż działającego kodu, ponieważ cała intencja polega na przetestowaniu tylko części całości.
Czy konstruowanie obiektów z zerowym testem jednostkowym ma zapach kodu?
null
radia, ograniczenie prędkości jest poprawnie obliczone. Teraz możesz utworzyć test, aby sprawdzić ograniczenie prędkości za pomocą radia; na wypadek, gdyby zachowanie się różniło ...
Motor
prawdopodobnie nie powinien miećspeed
wcale. Powinien miećthrottle
i obliczyć natorque
podstawie bieżącejrpm
ithrottle
. Zadaniem samochodu jest wykorzystanie goTransmission
do zintegrowania tego z aktualną prędkością i przekształcenie go wrpm
sygnał z powrotem doMotor
... Ale wydaje mi się, że i tak nie byłeś zaangażowany w realizm, prawda?