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?

Susan Sarandon
Freigeben: 2025-01-12 08:01:42
Original
169 Leute haben es durchsucht

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

Unit-Tests und DateTime.Now: Best Practices

Unit-Tests erfordern oft die Steuerung der Systemzeit, um verschiedene Szenarien zu simulieren. Eine direkte Änderung der Systemuhr ist unpraktisch und riskant. Die Lösung liegt in Abhängigkeitsinjektion und Abstraktion.

Die Kraft der Abstraktion

Der Schlüssel besteht darin, die Zeitquelle zu abstrahieren und in Ihren Code einzufügen. Dies ermöglicht ein einfaches Ersetzen des Echtzeitanbieters durch einen Mock während des Tests.

Lassen Sie uns eine Schnittstelle erstellen:

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

Diese Schnittstelle definiert einen Vertrag zum Erhalten der aktuellen UTC-Zeit. Wir implementieren es mit einer Standardklasse:

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

Nun verwenden wir dies in einer abhängigen Klasse:

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

In Tests können Sie einen simulierten ITimeProvider einfügen, der einen vorgegebenen DateTime Wert zurückgibt und so eine vollständige Kontrolle über die Zeit innerhalb Ihrer Tests ermöglicht.

Der Ambient-Context-Ansatz

Alternativ kann ein Umgebungskontext verwendet werden:

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

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

Dies stellt einen weltweit zugänglichen Zeitanbieter bereit. In Ihren Tests können Sie TimeContext.Current vorübergehend auf eine Simulation einstellen und daran denken, es nach jedem Test auf die Standardeinstellung zurückzusetzen, um Nebenwirkungen zu vermeiden.

Denken Sie daran: Bereinigen Sie Ihren Umgebungskontext nach jedem Test, um unbeabsichtigte Folgen bei nachfolgenden Tests oder der Anwendung selbst zu verhindern. Zu diesem Zweck wird dringend empfohlen, eine using-Anweisung oder einen finally-Block zu verwenden.

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