我开始为当前项目编写一些单元测试。我真的没有经验。我首先要完全“得到它”,所以我目前既不使用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){...}
}
另一个Car Code Example(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
需要Car
用a Motor
才能完成任务。它根本不感兴趣CarRadio
,因此我为此提供了null。
我想知道一个没有完全构建就提供正确功能的对象是否违反了SRP或代码气味。我有这样的感觉,但speedLimit.IsViolatedBy(motor)
感觉也不正确-汽车而不是汽车违反了速度限制。对于单元测试和工作代码,也许我只需要一个不同的角度,因为整个目的只是测试整个部分的一部分。
在单元测试中使用null构造对象会产生代码异味吗?
null
无线电,可以正确计算速度限制。现在,你可能要创建一个测试来验证限速与无线电; 万一行为有所不同……
Motor
可能根本不应该有speed
。它应该有一个,throttle
并torque
根据当前rpm
和计算athrottle
。使用aTransmission
将其集成到当前速度,并将其转化rpm
为信号以回馈给汽车,这是汽车的工作Motor
。但是我想,无论如何,您并不是出于现实,不是吗?