Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengesan Kod Ujian Unit Bergantung pada `DateTime.Now`?
DateTime.Now
: Amalan TerbaikUjian 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.
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.
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!