Maison >développement back-end >C++ >Comment isoler « DateTime.Now » pour des tests unitaires efficaces ?

Comment isoler « DateTime.Now » pour des tests unitaires efficaces ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-12 08:10:42911parcourir

How to Isolate `DateTime.Now` for Effective Unit Testing?

Test unitaire : isoler DateTime.Now

Lors des tests unitaires, il est souvent nécessaire de contrôler l'heure actuelle sans changer l'horloge du système. Cela crée des défis lorsque le code s'appuie sur DateTime.Now.

La meilleure approche consiste à créer une couche d'abstraction autour de DateTime.Now. L'injection de cette abstraction dans le code testé permet de simuler l'heure actuelle lors des tests unitaires.

Alternative : Contexte environnemental

<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>

Comment l'utiliser :

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

Dans les tests unitaires :

<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>

Cependant, assurez-vous de nettoyer vos appareils de test en appelant TimeProvider.ResetToDefault() pour éviter d'interférer avec les tests suivants.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn