Saya mulai menulis beberapa unit test untuk proyek saya saat ini. Saya tidak benar-benar memiliki pengalaman dengannya. Pertama saya ingin sepenuhnya "mengerti", jadi saya saat ini tidak menggunakan framework IoC saya atau perpustakaan yang mengejek.
Saya bertanya-tanya apakah ada yang salah dengan memberikan argumen nol untuk konstruktor objek dalam unit test. Biarkan saya memberikan beberapa contoh kode:
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){...}
}
Namun Another Car Code Example (TM), berkurang menjadi hanya bagian-bagian yang penting untuk pertanyaan. Saya sekarang menulis tes seperti ini:
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));
}
}
Tes berjalan dengan baik. SpeedLimit
perlu Car
dengan Motor
untuk melakukan hal itu. Itu tidak tertarik CarRadio
sama sekali, jadi saya berikan nol untuk itu.
Saya bertanya-tanya apakah suatu objek menyediakan fungsionalitas yang benar tanpa sepenuhnya dibangun adalah pelanggaran SRP atau bau kode. Saya memiliki perasaan yang mengganggu, tetapi speedLimit.IsViolatedBy(motor)
tidak terasa benar - batas kecepatan dilanggar oleh mobil, bukan motor. Mungkin saya hanya perlu perspektif berbeda untuk unit test vs kode kerja, karena seluruh niatnya adalah untuk menguji hanya sebagian saja.
Apakah membangun objek dengan null dalam tes unit bau kode?
null
radio, batas kecepatan dihitung dengan benar. Sekarang Anda mungkin ingin membuat tes untuk memvalidasi batas kecepatan dengan radio; kalau-kalau perilakunya berbeda ...
Motor
mungkin seharusnya tidak memilikispeed
sama sekali. Seharusnyathrottle
dan menghitungtorque
berdasarkan arusrpm
danthrottle
. Adalah tugas mobil untuk menggunakanTransmission
untuk mengintegrasikan itu ke kecepatan saat ini, dan untuk mengubahnya menjadirpm
sinyal untuk kembali keMotor
... Tapi saya kira, Anda toh tidak ada di dalamnya untuk realisme, kan?