Maison > développement back-end > C++ > Comment puis-je tester efficacement un code en fonction de DateTime.Now ?

Comment puis-je tester efficacement un code en fonction de DateTime.Now ?

Barbara Streisand
Libérer: 2025-01-12 07:49:45
original
207 Les gens l'ont consulté

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

Défis et stratégies pour les tests unitaires qui s'appuient sur DateTime.Now

Le code de test unitaire qui s'appuie sur l'heure actuelle est souvent délicat car la valeur de DateTime.Now change dynamiquement. Il n'est pas conseillé de modifier manuellement l'heure du système, une solution efficace est donc nécessaire.

La meilleure pratique consiste à isoler l'abstraction temporelle actuelle et à l'injecter dans le consommateur. De cette façon, le temps peut être manipulé dans les tests unitaires sans affecter le système sous-jacent.

Une autre approche consiste à définir une abstraction temporelle comme contexte environnemental. Cette approche implique la création d'une classe statique qui donne accès à l'heure actuelle et permet de la remplacer par un objet fictif lors des tests.

L'extrait de code suivant définit un TimeProvider comme contexte d'environnement :

<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>
Copier après la connexion

TimeProvider est utilisé comme suit :

<code class="language-csharp">var now = TimeProvider.Current.UtcNow;</code>
Copier après la connexion

Dans les tests unitaires, TimeProvider.Current peut être remplacé par un objet fictif :

<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>
Copier après la connexion

N'oubliez pas de réinitialiser le TimeProvider à son état par défaut après chaque test. Cela garantit que les tests unitaires ultérieurs ne sont pas affectés par l’abstraction temporelle modifiée.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal