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
Patricia Arquetteasal
2025-01-12 08:10:42931semak imbas

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

<code class="language-csharp">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;
    }            
}</code>

Cara menggunakannya:

<code class="language-csharp">var now = TimeProvider.Current.UtcNow;</code>

Dalam ujian unit:

<code class="language-csharp">var timeMock = new Mock<TimeProvider>();
timeMock.SetupGet(tp => tp.UtcNow).Returns(new DateTime(2010, 3, 11));
TimeProvider.Current = timeMock.Object;</code>

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:
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