Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Berkesan Kod Ujian Unit Bergantung pada `DateTime.Now`?
Mengasingkan Kebergantungan Masa dalam Ujian Unit
Kod ujian bergantung pada DateTime.Now
memberikan cabaran yang unik. Menguji secara langsung terhadap jam sistem memperkenalkan ketidakstabilan dan menjadikan ujian kurang dipercayai. Berikut ialah dua pendekatan berkesan untuk mengurus pergantungan ini:
Pendekatan 1: Suntikan Ketergantungan
Kaedah pilihan adalah untuk mengabstrakkan pergantungan masa. Buat antara muka (cth., ITimeProvider
) mentakrifkan kaedah untuk mendapatkan masa semasa. Laksanakan antara muka ini dengan kelas konkrit (cth., SystemTimeProvider
) yang menggunakan DateTime.Now
. Suntikan antara muka ini ke dalam kelas anda yang memerlukan masa semasa.
Semasa ujian unit, anda boleh menyuntik olok-olok ITimeProvider
yang mengembalikan nilai DateTime
yang telah ditetapkan. Ini memberi anda kawalan sepenuhnya ke atas masa yang digunakan dalam ujian anda tanpa menjejaskan jam sistem.
Pendekatan 2: Konteks Ambien (dengan Berhati-hati)
Pilihan lain melibatkan penggunaan konteks statik. Buat kelas asas (cth., TimeProvider
) dengan sifat Current
statik yang memegang penyedia masa aktif. Pelaksanaan lalai (cth., SystemTimeProvider
) boleh ditetapkan pada mulanya.
Untuk ujian, ganti sifat Current
statik untuk menggunakan penyedia olok-olok. Amat penting, ingat untuk menetapkan semula sifat Current
kepada lalai selepas setiap ujian untuk mengelakkan tingkah laku yang tidak dijangka dalam ujian berikutnya. Pendekatan ini memerlukan pembersihan yang teliti untuk mengelakkan gangguan ujian.
Ringkasan
Kedua-dua kaedah membenarkan pengasingan kebergantungan masa yang berkesan dalam ujian unit anda. Walau bagaimanapun, suntikan pergantungan biasanya lebih disukai kerana reka bentuknya yang lebih bersih dan mengurangkan risiko kesan sampingan yang tidak diingini berbanding menggunakan konteks ambien statik.
Atas ialah kandungan terperinci Bagaimana untuk Berkesan Kod Ujian Unit Bergantung pada `DateTime.Now`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!