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

Comment puis-je tester efficacement le code unitaire en fonction de « DateTime.Now » ?

Susan Sarandon
Libérer: 2025-01-12 08:01:42
original
192 Les gens l'ont consulté

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

Tests unitaires et DateTime.Now : meilleures pratiques

Les tests unitaires nécessitent souvent de contrôler l'heure du système pour simuler divers scénarios. Modifier directement l’horloge du système est peu pratique et risqué. La solution réside dans l'injection de dépendances et l'abstraction.

Le pouvoir de l'abstraction

La clé est d'abstraire la source temporelle et de l'injecter dans votre code. Cela permet de remplacer facilement le fournisseur en temps réel par une simulation pendant les tests.

Créons une interface :

<code class="language-csharp">interface ITimeProvider
{
    DateTime UtcNow { get; }
}</code>
Copier après la connexion

Cette interface définit un contrat pour obtenir l'heure UTC actuelle. Nous allons l'implémenter avec une classe par défaut :

<code class="language-csharp">class DefaultTimeProvider : ITimeProvider
{
    public DateTime UtcNow => DateTime.UtcNow;
}</code>
Copier après la connexion

Maintenant, utilisons ceci dans une classe dépendante :

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

Dans les tests, vous pouvez injecter une simulation ITimeProvider renvoyant une DateTime valeur prédéterminée, offrant un contrôle complet sur le temps au sein de vos tests.

L'approche du contexte ambiant

Alternativement, un contexte ambiant peut être utilisé :

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

    public static ITimeProvider Current
    {
        get => _current;
        set => _current = value;
    }
}</code>
Copier après la connexion

Cela fournit un fournisseur de temps accessible à l’échelle mondiale. Dans vos tests, vous pouvez temporairement définir TimeContext.Current sur une simulation, et n'oubliez pas de le restaurer par défaut après chaque test pour éviter les effets secondaires.

Rappelez-vous : nettoyez votre contexte ambiant après chaque test pour éviter des conséquences inattendues lors des tests ultérieurs ou dans l'application elle-même. L'utilisation d'une instruction using ou d'un bloc finally est fortement recommandée à cet effet.

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