現在のプロジェクトのユニットテストをいくつか書き始めました。私は実際にそれを経験していません。最初に完全に「取得」したいので、現在IoCフレームワークもモックライブラリも使用していません。
ユニットテストでオブジェクトのコンストラクターにnull引数を提供することに何か問題があるのではないかと思っていました。サンプルコードを提供します。
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
としMotor
、そのことを行うために。それはまったく興味がないCarRadio
ので、そのためにヌルを提供しました。
完全に構築されずに正しい機能を提供するオブジェクトが、SRPの違反またはコードの匂いであるかどうか疑問に思っています。私はこのしつこい感じを持っていますが、speedLimit.IsViolatedBy(motor)
どちらかと言えば正しくありません-モーターではなく車が速度制限に違反しています。全体の意図は全体の一部のみをテストすることであるため、単体テストと作業コードでは異なる視点が必要なのかもしれません。
単体テストでnullを使用してオブジェクトを構築すると、コードのにおいがしますか?
null
ラジオで速度制限が正しく計算されていることをテストしました。ここで、無線で速度制限を検証するテストを作成できます。動作が異なる場合に備えて...
Motor
いますが、おそらくまったくありませんspeed
。現在のとに基づいて、throttle
とを計算する必要があります。それを使用して、それを現在の速度に統合し、それをに戻して信号に戻すのは、車の仕事です...しかし、とにかく、あなたはリアリズムのためにそこにいなかったのですか?torque
rpm
throttle
Transmission
rpm
Motor