Angular : comment résoudre le problème : Cannot read property 'root' of undefined Unit test et Jasmine

Karma - Cannot read property 'root' of undefined - angular

Vous ĂŞtes en train de tester votre composant, qui utilise des Router et des ActivatedRoute, et paf, vous tombez sur l’erreur : Cannot read property ‘root’ of undefined.
Des heures plus tard, impossible de trouver une solution à votre problème. Comment faire ?

 

Debugger, pas Ă  pas

Bon, malgré les schemas: [ NO_ERRORS_SCHEMA ] ou autre astuce un peu uggly, rien n’y fait, vous avez toujours l’erreur.

Avant de vous pendre et maudir Angular toute votre vie … cherchons à isoler le problème.

 

Un composant qui utilise Router et ActivatedRoute

Votre composant doit ressembler de près (ou de loin Open-mouthed smile) à celui-ci, non ?
carbon (38)

Isolons le problème

Quand on fait des recherches sur le net au sujet de l’erreur, on tombe toujours sur la notion de Route, de Router.

OK, et vous devez avoir une erreur de ce type sur votre page Karma, non ?

Karma - Google Chrome

 

Alors si c’est à propos des routes, ou des router, enlevons tout d’abord tout ce qui est au sujet des Routes.

Vous obtenez alors un Composant comme ceci :

carbon (39)

 

Et là, vous relancez vos tests, et …. oh, ben plus d’erreurs Open-mouthed smile

OK, on est sur la bonne voie.

Isolons encore notre problème

On va juste commenter private _router: Router. Résultat ? Toujours l’erreur Sad smile

On fait la même chose, avec private _route: ActivatedRoute (en réactivant la ligne d’au-dessus). Et là … le problème n’est plus là !

 

Le problème vient donc assurément d’Angular qui n’arrive pas à récupérer une route active, car nous sommes dans un environnement de test.

 

La solution pour rĂ©soudre le problème : Cannot read property ‘root’ of undefined

Pour corriger le problème et garder notre composant qui utilise Router et ActivatedRoute, c’est de : créer une class MockActivatedRoute qui va simuler le comportement.

Création de la classe MockActivatedRoute

carbon (40)

 

Le point à noter ici, nous utilisons la classe RxJs : BehaviorSubject, qui permet d’émettre un contenu, dès qu’on s’y est inscrit.

 

Fournissons une instance Ă  notre TestBed

Tout d’abord, créons l’instance, dans notre fichier Jasmine :

carbon (41)

 

Puis injectons la dépendance ActivatedRoute, sur cette instance

Nous utilisons ici la force d’injection de dépendance d’Angular et de Jasmine Smile

carbon (42)

 

On relance les tests avec ng test

(normalement, ça se recharge tout seul hein)

Mission accomplie !!  Open-mouthed smile 

A plus, le problème !

Notre adresse

1 rue du guesclin
44000 Nantes

Notre téléphone

+33 2 79 65 52 87

Société

DevToBeCurious SARL
84860163900018 - Nantes B 848 601 639