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. SpeedLimitpotrzebuje Carz Motorcelem, 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?
nullradia, 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 ...
Motorprawdopodobnie nie powinien miećspeedwcale. Powinien miećthrottlei obliczyć natorquepodstawie bieżącejrpmithrottle. Zadaniem samochodu jest wykorzystanie goTransmissiondo zintegrowania tego z aktualną prędkością i przekształcenie go wrpmsygnał z powrotem doMotor... Ale wydaje mi się, że i tak nie byłeś zaangażowany w realizm, prawda?