Я начал писать тестовые модули для моего текущего проекта. У меня действительно нет опыта с этим все же. Сначала я хочу полностью «получить его», поэтому в настоящее время я не использую ни свою платформу IoC, ни библиотеку-макет.
Мне было интересно, если что-то не так с предоставлением нулевых аргументов конструкторам объектов в модульных тестах. Позвольте мне привести пример кода:
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){...}
}
Еще один пример автомобильного кода (ТМ), сводится только к тем частям, которые важны для вопроса. Я сейчас написал тест примерно так:
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
Нужно Car
с собой Motor
, чтобы делать свое дело. Это совсем не интересно CarRadio
, поэтому я предоставил для этого значение null.
Мне интересно, является ли объект, обеспечивающий правильную функциональность, не будучи полностью сконструированным, нарушением SRP или запахом кода. У меня есть это ноющее чувство, что оно есть, но speedLimit.IsViolatedBy(motor)
и не правильно - ограничение скорости нарушается автомобилем, а не мотором. Может быть, мне просто нужна другая точка зрения для модульных тестов по сравнению с рабочим кодом, потому что все намерение состоит в том, чтобы протестировать только часть целого.
Является ли создание объектов с нулем в модульных тестах запахом кода?
null
радио правильно рассчитывается ограничение скорости. Теперь вы можете создать тест для проверки ограничения скорости с помощью радио; на всякий случай поведение отличается ...
Motor
вероятно, не должно бытьspeed
вообще. Он должен иметьthrottle
и вычислять наtorque
основе текущегоrpm
иthrottle
. Работа автомобиля состоит в том, чтобы использовать его,Transmission
чтобы интегрировать это в текущую скорость, и превратить это вrpm
сигнал, чтобы сигнализироватьMotor
... Но я полагаю, вы все равно не были заинтересованы в реализме, не так ли?