Rumah > pembangunan bahagian belakang > C++ > Bagaimana Saya Boleh Berkesan Kod Ujian Unit Bergantung pada DateTime.Now?

Bagaimana Saya Boleh Berkesan Kod Ujian Unit Bergantung pada DateTime.Now?

Barbara Streisand
Lepaskan: 2025-01-12 07:49:45
asal
235 orang telah melayarinya

How Can I Effectively Unit Test Code Dependent on DateTime.Now?

Cabaran dan strategi untuk ujian unit yang bergantung pada DateTime.Now

Kod ujian unit yang bergantung pada masa semasa selalunya rumit kerana nilai DateTime.Now berubah secara dinamik. Menukar masa sistem secara manual tidak digalakkan, jadi penyelesaian yang cekap diperlukan.

Amalan terbaik ialah mengasingkan abstraksi masa semasa dan menyuntiknya ke dalam pengguna. Dengan cara ini, masa boleh dimanipulasi dalam ujian unit tanpa menjejaskan sistem asas.

Pendekatan lain ialah mentakrifkan abstraksi masa sebagai konteks persekitaran. Pendekatan ini melibatkan mencipta kelas statik yang menyediakan akses kepada masa semasa dan membenarkan menggantikannya dengan objek olok-olok semasa ujian.

Coretan kod berikut mentakrifkan TimeProvider sebagai 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>
Salin selepas log masuk

Penyedia Masa digunakan seperti berikut:

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

Dalam ujian unit, TimeProvider.Current boleh digantikan dengan objek olok-olok:

<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>
Salin selepas log masuk

Sentiasa ingat untuk menetapkan semula TimeProvider kepada keadaan lalai selepas setiap ujian. Ini memastikan bahawa ujian unit berikutnya tidak dipengaruhi oleh abstraksi temporal yang diubah.

Atas ialah kandungan terperinci Bagaimana Saya Boleh Berkesan Kod Ujian Unit Bergantung pada DateTime.Now?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan