Je teste en bloc un composant utilisé pour éditer un objet. L'objet a un unique id
qui est utilisé afin de récupérer l'objet spécifique d'un tableau d'objets hébergés dans un service. Le spécifique id
est obtenu via un paramètre qui est passé via le routage, en particulier via la ActivatedRoute
classe.
Le constructeur est le suivant:
constructor(private _router:Router, private _curRoute:ActivatedRoute, private _session:Session) {
}
ngOnInit() {
this._curRoute.params.subscribe(params => {
this.userId = params['id'];
this.userObj = this._session.allUsers.filter(user => user.id.toString() === this.userId.toString())[0];
Je souhaite exécuter des tests unitaires de base sur ce composant. Cependant, je ne suis pas sûr de la façon dont je peux injecter le id
paramètre, et le composant a besoin de ce paramètre.
Au fait: j'ai déjà une maquette pour le Session
service, donc pas de soucis là-bas.
Uncaught NetworkError: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'ng:///DynamicTestModule/HomeContentComponent.ngfactory.js'. at http://localhost:9876/_karma_webpack_/polyfills.bundle.js:2605
of
doit être utilisé seul. Vous utiliserez probablement aussi à laRouterTestingModule
place du code de cette réponse.J'ai compris comment faire cela!
Puisqu'il
ActivatedRoute
s'agit d'un service, un service simulé peut être établi. Appelons ce service simuléMockActivatedRoute
. Nous prolongeronsActivatedRoute
dansMockActivatedRoute
, comme suit:La ligne
super(null, ....)
initialise la super classe, qui a quatre paramètres obligatoires. Cependant, dans ce cas, nous n'avons besoin d'aucun de ces paramètres, nous les initialisons donc avec desnull
valeurs. Tout ce dont nous avons besoin est dont la valeurparams
est unObservable<>
. Par conséquent, avecthis.params
, nous remplaçons la valeur deparams
et l'initialisons comme étantObservable<>
le paramètre sur lequel le sujet de test s'appuie.Ensuite, comme tout autre service fictif, initialisez-le et remplacez le fournisseur du composant.
Bonne chance!
la source
super
ouObservable
. D'où viennent ceux là?super()
est intégré.Observable
est derxjs/Observable
ou simplement enrxjs
fonction de votre version. Vous l'obtiendrez en utilisantimport {Observable} from 'rxjs'
.Dans angular 8+ il y a le RouterTestingModule, que vous pouvez utiliser pour avoir accès à l'ActivatedRoute ou au Router du composant. Vous pouvez également transmettre des routes au RouterTestingModule et créer des espions pour les méthodes de route demandées.
Par exemple dans mon composant j'ai:
Et dans mon test j'ai:
et plus tard dans la section «it»:
De la même manière, je pense que vous pouvez tester directement la paramMap via la méthode spyOnProperty de jasmine, en renvoyant un observable ou en utilisant des billes rxjs. Cela peut gagner du temps et ne nécessite pas non plus de maintenir une classe fictive supplémentaire. J'espère que c'est utile et logique.
la source
Voici comment je l'ai testé dans la dernière version angulaire 2.0 ...
et dans la section Fournisseurs
la source
Ajoutez simplement une maquette de ActivatedRoute:
...
la source
Pour certaines personnes travaillant sur Angular> 5, si Observable.of (); ne fonctionne pas alors ils peuvent utiliser juste of () en important import {of} depuis 'rxjs';
la source
Ran dans le même problème lors de la création de suites de tests pour un chemin de routage comme:
Dans le composant, j'ai initialisé la propriété passée comme suit:
Lors de l'exécution des tests, si vous ne transmettez pas une valeur de propriété dans votre simulation ActivatedRoute "useValue", alors vous obtiendrez undefined lors de la détection des modifications en utilisant "fixture.detectChanges ()". Cela est dû au fait que les valeurs fictives pour ActivatedRoute ne contiennent pas la propriété params.property. Ensuite, il est nécessaire que la valeur useValue fictive ait ces paramètres pour que le projecteur initialise «this.property» dans le composant. Vous pouvez l'ajouter comme:
Le vous pouvez commencer à tester comme par exemple:
Maintenant, disons que vous souhaitez tester une valeur de propriété différente, vous pouvez alors mettre à jour votre maquette ActivatedRoute comme:
J'espère que cela t'aides!
la source
Ajout du fournisseur dans la classe de test comme:
la source