Comecei a escrever alguns testes de unidade para o meu projeto atual. Eu realmente não tenho experiência com isso, no entanto. Primeiro, quero "obtê-lo" completamente, portanto, atualmente não estou usando nem minha estrutura de IoC nem uma biblioteca de simulação.
Fiquei me perguntando se há algo errado em fornecer argumentos nulos para construtores de objetos em testes de unidade. Deixe-me fornecer um código de exemplo:
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){...}
}
Outro exemplo de código de carro (TM), reduzido a apenas as partes importantes para a questão. Agora eu escrevi um teste mais ou menos assim:
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));
}
}
O teste corre bem. SpeedLimitprecisa de um Carcom um Motorpara fazer sua coisa. Ele não está interessado em CarRadionada, por isso forneci nulo para isso.
Gostaria de saber se um objeto que fornece a funcionalidade correta sem ser totalmente construído é uma violação do SRP ou um cheiro de código. Tenho essa sensação incômoda, mas speedLimit.IsViolatedBy(motor)também não parece certa - um limite de velocidade é violado por um carro, não por um motor. Talvez eu só precise de uma perspectiva diferente para testes de unidade e código de trabalho, porque toda a intenção é testar apenas uma parte do todo.
A construção de objetos com null em testes de unidade é um cheiro de código?
nullrádio, o limite de velocidade é calculado corretamente. Agora você pode criar um teste para validar o limite de velocidade com um rádio; apenas no caso de o comportamento variar ...
Motorprovavelmente não deveria ter umspeed. Ele deve ter umthrottlee calcular um comtorquebase no atualrpmethrottle. O trabalho do carro é usar umTransmissionpara integrar isso à velocidade atual e transformá-lo em umrpmsinal de volta para oMotor... Mas eu acho que você não estava interessado no realismo, estava?