24 Août 2015

Comment créer un STUB d’une méthode d’extension.

Pour commencer voici quelques liens afin de vulgariser STUB et Méthode d’extension.
Après cet éclaircissement, je peux vous expliquer pourquoi il m’est arrivé de devoir mettre en place un STUB sur une méthode d’extension lors de développement sur du code legacy.
Dans ce fameux code, une méthode d’extension fut développée, mais celle-ci faisait appel à une ressource externe. Ma première réaction était de me dire de ne plus passer par cette méthode mais plutôt par un objet non static qui implémenterai un interface serait plus facilement “Stubable”. En effet, je peux aisément l’injecter dans la classe qui en a besoin et ainsi définir pour mes tests une autre implémentation de cette interface. Cependant un grand nombre de références à cette extension fut remonté. Afin de ne pas modifier tout le code qui n’était pas protégé par des tests, j’ai préféré chercher un moyen de “Stuber” la méthode d’extension.

Imaginons l’extension suivant:

Pour l’utiliser il me suffit de faire:

Supposons que nous possédons un classe permettant de parser l’html reçu:

Maintenant je pose mon test sur la méthode ExtractBody  de la classe HtmlParser:

Ce code fonctionne très bien sur mon poste, seul hic, ma plateforme de build n’a pas d’accès à Internet… Il me faut donc une astuce me permettant de “Stuber”  la méthode Read().

Pour ce faire nous allons utiliser un delegate. D’ailleurs connaissez-vous les delegate? Si non, je vous conseil les liens suivants expression lambda et Func<T,Tresult>.

Vous êtes fin prêt…

Repartons de notre classe d’extensions:

Il nous faut déléguer l’implémentation de notre méthode afin de pouvoir la “Stuber”:

Pour rendre visible la méthode  ReadMethod il nous suffit de placer dans AssemblyInfo de notre projet qui implémente UriExtensions la ligne suivante:

Et nous nous autoriserons à la modifier seulement dans nos tests.

Le travail n’étant pas fini, nous allons définir une implémentation par défaut pour notre code de production:

Vous allez me dire que cela ne change rien car Read à la même implémentation qu’avant, il nous font donc la modifier:

Et voila la magie peut opérer ;-), il ne me reste plus qu’à modifier mon test et le tour est joué

Si je peux me permettre un petit conseil sur l’implémentation de méthodes d’extension, c’est de les utiliser avec parcimonie et qu’il faut éviter à tout prix qu’elles utilisent des ressources externes.

 

Share