Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengesan Kod Ujian Unit Bergantung pada `DateTime.Now`?

Bagaimanakah Saya Boleh Mengesan Kod Ujian Unit Bergantung pada `DateTime.Now`?

Susan Sarandon
Susan Sarandonasal
2025-01-12 08:01:42170semak imbas

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

Ujian Unit dan DateTime.Now: Amalan Terbaik

Ujian unit selalunya memerlukan kawalan masa sistem untuk mensimulasikan pelbagai senario. Mengubah jam sistem secara langsung adalah tidak praktikal dan berisiko. Penyelesaiannya terletak pada suntikan kebergantungan dan abstraksi.

Kuasa Abstraksi

Kuncinya ialah mengabstrak sumber masa dan menyuntiknya ke dalam kod anda. Ini membolehkan penggantian mudah penyedia masa nyata dengan olok-olok semasa ujian.

Mari buat antara muka:

<code class="language-csharp">interface ITimeProvider
{
    DateTime UtcNow { get; }
}</code>

Antara muka ini mentakrifkan kontrak untuk mendapatkan masa UTC semasa. Kami akan melaksanakannya dengan kelas lalai:

<code class="language-csharp">class DefaultTimeProvider : ITimeProvider
{
    public DateTime UtcNow => DateTime.UtcNow;
}</code>

Sekarang, mari kita gunakan ini dalam kelas bergantung:

<code class="language-csharp">class MyDependentClass
{
    private readonly ITimeProvider _timeProvider;

    public MyDependentClass(ITimeProvider timeProvider)
    {
        _timeProvider = timeProvider;
    }

    public void MyMethod()
    {
        var currentTime = _timeProvider.UtcNow;
        // ... use currentTime ...
    }
}</code>

Dalam ujian, anda boleh menyuntik olok-olok ITimeProvider mengembalikan nilai DateTime yang telah ditetapkan, memberikan kawalan penuh sepanjang masa dalam ujian anda.

Pendekatan Konteks Ambien

Sebagai alternatif, konteks ambien boleh digunakan:

<code class="language-csharp">public static class TimeContext
{
    private static ITimeProvider _current = new DefaultTimeProvider();

    public static ITimeProvider Current
    {
        get => _current;
        set => _current = value;
    }
}</code>

Ini menyediakan penyedia masa yang boleh diakses secara global. Dalam ujian anda, anda boleh menetapkan TimeContext.Current kepada olok-olok buat sementara waktu dan ingat untuk memulihkannya kepada lalai selepas setiap ujian untuk mengelakkan kesan sampingan.

Ingat: Bersihkan konteks ambien anda selepas setiap ujian untuk mengelakkan akibat yang tidak diingini dalam ujian berikutnya atau aplikasi itu sendiri. Menggunakan pernyataan using atau blok finally amat disyorkan untuk tujuan ini.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengesan Kod Ujian Unit Bergantung pada `DateTime.Now`?. 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