Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mengasingkan `DateTime.Now` untuk Ujian Unit Berkesan?

Bagaimana untuk Mengasingkan `DateTime.Now` untuk Ujian Unit Berkesan?

Patricia Arquette
Lepaskan: 2025-01-12 08:10:42
asal
956 orang telah melayarinya

How to Isolate `DateTime.Now` for Effective Unit Testing?

Ujian Unit: Asingkan DateTime.Now

Apabila melakukan ujian unit, selalunya perlu mengawal masa semasa tanpa mengubah jam sistem. Ini mewujudkan cabaran apabila kod bergantung pada DateTime.Now.

Pendekatan terbaik ialah mencipta lapisan abstraksi di sekitar DateTime.Now. Menyuntik abstraksi ini ke dalam kod yang sedang diuji membolehkan anda mensimulasikan masa semasa semasa ujian unit.

Alternatif: Konteks Persekitaran

public abstract class TimeProvider
{
    private static TimeProvider current = DefaultTimeProvider.Instance;

    public static TimeProvider Current
    {
        get { return TimeProvider.current; }
        set 
        {
            if (value == null)
            {
                throw new ArgumentNullException("value");
            }
            TimeProvider.current = value; 
        }
    }

    public abstract DateTime UtcNow { get; }

    public static void ResetToDefault()
    {    
        TimeProvider.current = DefaultTimeProvider.Instance;
    }            
}
Salin selepas log masuk

Cara menggunakannya:

var now = TimeProvider.Current.UtcNow;
Salin selepas log masuk

Dalam ujian unit:

var timeMock = new Mock<TimeProvider>();
timeMock.SetupGet(tp => tp.UtcNow).Returns(new DateTime(2010, 3, 11));
TimeProvider.Current = timeMock.Object;
Salin selepas log masuk

Walau bagaimanapun, pastikan anda membersihkan lekapan ujian anda dengan menghubungi TimeProvider.ResetToDefault() untuk mengelak daripada mengganggu ujian berikutnya.

Atas ialah kandungan terperinci Bagaimana untuk Mengasingkan `DateTime.Now` untuk Ujian Unit Berkesan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan