Heim > Backend-Entwicklung > C++ > Wie kann ich Code abhängig von DateTime.Now effektiv testen?

Wie kann ich Code abhängig von DateTime.Now effektiv testen?

Barbara Streisand
Freigeben: 2025-01-12 07:49:45
Original
205 Leute haben es durchsucht

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

Herausforderungen und Strategien für Unit-Tests, die auf DateTime.Now basieren

Unit-Testcode, der auf der aktuellen Zeit basiert, ist oft schwierig, da sich der Wert von DateTime.Now dynamisch ändert. Eine manuelle Änderung der Systemzeit ist nicht ratsam, daher bedarf es einer effizienten Lösung.

Die beste Vorgehensweise besteht darin, die aktuelle Zeitabstraktion zu isolieren und sie in den Verbraucher einzuspeisen. Auf diese Weise kann die Zeit in Unit-Tests manipuliert werden, ohne das zugrunde liegende System zu beeinträchtigen.

Ein anderer Ansatz besteht darin, eine Zeitabstraktion als Umgebungskontext zu definieren. Bei diesem Ansatz wird eine statische Klasse erstellt, die Zugriff auf die aktuelle Zeit bietet und es ermöglicht, diese während des Tests durch ein Scheinobjekt zu ersetzen.

Der folgende Codeausschnitt definiert einen TimeProvider als Umgebungskontext:

<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>
Nach dem Login kopieren

TimeProvider wird wie folgt verwendet:

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

In Unit-Tests kann TimeProvider.Current durch ein Scheinobjekt ersetzt werden:

<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>
Nach dem Login kopieren

Denken Sie immer daran, den TimeProvider nach jedem Test auf seinen Standardzustand zurückzusetzen. Dadurch wird sichergestellt, dass nachfolgende Unit-Tests nicht von der geänderten zeitlichen Abstraktion betroffen sind.

Das obige ist der detaillierte Inhalt vonWie kann ich Code abhängig von DateTime.Now effektiv testen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage