Dans les applications sensibles au temps, se moquer avec précision de l'heure actuelle peut être crucial pour les tests unitaires. Cependant, time.Now() est souvent invoqué à plusieurs endroits, ce qui rend difficile le suivi précis du temps écoulé.
La solution suggérée dans le fil de discussion Golang-nuts auquel vous avez fait référence fournit une approche solide en définissant une interface Clock personnalisée qui englobe les fonctionnalités du package time :
type Clock interface { Now() time.Time After(d time.Duration) <-chan time.Time }
Vous pouvez implémenter cette interface avec une implémentation concrète comme ceci :
type realClock struct{} func (realClock) Now() time.Time { return time.Now() } func (realClock) After(d time.Duration) <-chan time.Time { return time.After(d) }
Pour les tests, créez une implémentation simulée de l'interface Clock.
Bien qu'il puisse sembler tentant de modifier l'heure du système globalement pour les tests, cette approche est fortement déconseillée. Cela peut introduire des dépendances et des effets secondaires imprévisibles.
Comme alternative, envisagez de créer un package horaire personnalisé qui enveloppe le package horaire de la bibliothèque standard. Ce package personnalisé pourrait fournir une fonction permettant de passer à une implémentation de temps simulé pendant les tests.
Pour améliorer la testabilité et réduire les effets secondaires, efforcez-vous de concevoir votre code avec composants apatrides autant que possible. En structurant votre code en parties distinctes et testables, vous simplifiez le processus de tests unitaires et facilitez la garantie du comportement correct dans différentes conditions de temps.
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!