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. SpeedLimitperlu Cardengan Motoruntuk melakukan hal itu. Itu tidak tertarik CarRadiosama 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?
nullradio, batas kecepatan dihitung dengan benar. Sekarang Anda mungkin ingin membuat tes untuk memvalidasi batas kecepatan dengan radio; kalau-kalau perilakunya berbeda ...
Motormungkin seharusnya tidak memilikispeedsama sekali. Seharusnyathrottledan menghitungtorqueberdasarkan arusrpmdanthrottle. Adalah tugas mobil untuk menggunakanTransmissionuntuk mengintegrasikan itu ke kecepatan saat ini, dan untuk mengubahnya menjadirpmsinyal untuk kembali keMotor... Tapi saya kira, Anda toh tidak ada di dalamnya untuk realisme, kan?