Preferensi saya adalah memiliki kelas yang menggunakan waktu sebenarnya bergantung pada antarmuka, seperti
interface IClock
{
DateTime Now { get; }
}
Dengan implementasi yang konkrit
class SystemClock: IClock
{
DateTime Now { get { return DateTime.Now; } }
}
Kemudian jika mau, Anda dapat menyediakan jenis jam lain yang Anda inginkan untuk pengujian, seperti
class StaticClock: IClock
{
DateTime Now { get { return new DateTime(2008, 09, 3, 9, 6, 13); } }
}
Mungkin ada beberapa overhead dalam menyediakan jam ke kelas yang bergantung padanya, tetapi itu dapat ditangani oleh sejumlah solusi injeksi ketergantungan (menggunakan wadah Pembalikan Kontrol, injeksi konstruktor / penyetel lama biasa, atau bahkan Pola Gerbang Statis ).
Mekanisme lain untuk mengirimkan objek atau metode yang menyediakan waktu yang diinginkan juga berfungsi, tetapi menurut saya kuncinya adalah menghindari menyetel ulang jam sistem, karena itu hanya akan menimbulkan rasa sakit di level lain.
Selain itu, menggunakan DateTime.Now
dan memasukkannya ke dalam kalkulasi Anda tidak hanya terasa tidak tepat - ini merampas kemampuan Anda untuk menguji waktu tertentu, misalnya jika Anda menemukan bug yang hanya terjadi di dekat batas tengah malam, atau pada hari Selasa. Menggunakan waktu saat ini tidak memungkinkan Anda untuk menguji skenario tersebut. Atau setidaknya tidak kapan pun Anda mau.