DEV Community

Cover image for Comment mocker le logger en Go?
Maxime Guilbert
Maxime Guilbert

Posted on • Edited on

Comment mocker le logger en Go?

S'occuper des tests unitaires est toujours quelque chose de très important, mais aussi qui peut se révéler très long et/ou complèxe. Il arrive dans certaines situations qu'on se retrouve avec du code où la seule manière qu'on a de le vérifier si il a été appelé est de regarder les logs. (Surtout en Go où ça peut vite devenir la foire à la saucisse, mais où malheureusement l'injection dynamique de mocks n'existe pas)

Donc aujourd'hui on va voir comment adapter votre code pour résoudre ce problème et faciliter vos prochains tests unitaires.


Ajout d'une nouvelle variable

Pour faire simple, on va utiliser une technique déjà connue dans les tests unitaires en Go pour résoudre ce problème qui s'agit de créer une variable qui va contenir l'objet ou la fonction à mocker.

Dans chaque package, vous pourrez alors créer un fichier log.go dans lequel vous allez ajouter le code suivant :

var logger = log.New(os.Stderr, "", log.LstdFlags)
Enter fullscreen mode Exit fullscreen mode

Ensuite, vous n'aurez qu'à l'utiliser avec logger.Println(...)

Mais d'où vient ce code?

Ce code vient juste de la déclaration de la variable std dans la librairie log. Techniquement, on ne fait juste que dupliquer cette variable afin d'être capable de la modifier quand on en aura besoin.


Mock

Maintenant que vous avez ces variables de créées, il est bien plus simple de les mocker.

Pour ce faire, on va utiliser le code suivant

var (  
    buff bytes.Buffer  
    MockLogger = log.New(&buff, "", log.LstdFlags)  
)
Enter fullscreen mode Exit fullscreen mode

Comme vous le constatez la déclaration du mock est quasi identique à la déclaration du logger. La seule différence étant que le mock utilise un buffer comme endroit où écrire. Et cette différence est très importante car c'est grâce à cela qu'on va être capable ensuite de lire dans ce buffer pour voir quels logs ont été appelés.

Du coup, dans vos tests unitaires, il faut déclarer la ligne suivante pour remplacer votre logger par le mock

logger = mocks.MockLogger
Enter fullscreen mode Exit fullscreen mode

Et derrière, il ne vous restera qu'à récupérer le contenu des logs dans le buffer avec strings.Split(mocks.Buff.String(), "\n") pour être capable d'effectuer vos dernières vérifications.


Comme vous pouvez le voir, le tout reste simple, mais permet énormément de choses en plus qu'avant.

En tout cas j'espère que ça vous aidera! 🍺


Vous voulez me supporter?

Buy Me A Coffee

Top comments (0)