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
Susan Sarandonoriginal
2025-01-12 08:01:42167parcourir

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>

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>

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>

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>

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!

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