Я почав писати кілька тестів для мого поточного проекту. Але я насправді не маю досвіду з цим. Я спершу хочу повністю "отримати його", тому наразі я не використовую ні свого ІоК-рамки, ні глузуючої бібліотеки.
Мені було цікаво, чи є щось не так у наданні нульових аргументів конструкторам об'єктів в одиничних тестах. Дозвольте навести приклад коду:
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){...}
}
Ще один приклад автомобільного кодексу (TM), зведений лише до важливих для питання частин. Зараз я написав тест приблизно так:
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));
}
}
Тест працює нормально. SpeedLimit
потрібен a Car
з a Motor
, щоб зробити свою справу. Це взагалі не цікавить CarRadio
, тому я вказав нуль для цього.
Мені цікаво, чи об’єкт, що забезпечує правильну функціональність, не будуючи повністю, є порушенням SRP або запахом коду. У мене таке нудотне відчуття, що воно є, але speedLimit.IsViolatedBy(motor)
не відчуває себе правильно - обмеження швидкості порушується автомобілем, а не мотором. Можливо, мені просто потрібна інша перспектива для одиничних тестів проти робочого коду, тому що весь намір полягає в тестуванні лише частини цілого.
Чи побудова об'єктів з нульовими одиницями тестів кодовим запахом?
null
радіо правильно обчислюється обмеження швидкості. Тепер ви можете створити тест для перевірки обмеження швидкості за допомогою радіо; на випадок, якщо поведінка відрізняється ...
Motor
мабуть, не повинно бутиspeed
взагалі. Він повинен матиthrottle
і обчислювати наtorque
основі струмуrpm
іthrottle
. Завдання автомобіля - використовуватиTransmission
інтегрувати це в поточну швидкість, і перетворити цеrpm
на сигнал, щоб повернутися доMotor
... Але я думаю, ви все одно не були для цього реалізмом, чи не так?