J'ai un composant A qui utilise un composant B, c, D dans son modèle:
###template-compA.html
<comp-b></comp-b>
<comp-c [myinput]="obj.myinput"></comp-c>
<comp-d ></comp-d>
...etc
Pour simplifier, supposons qu’il n’existe qu’une directive dans le composant A:
###template-compA.html
<comp-b></comp-b>
Mon comp-b a ses propres dépendances (services ou autre comp).
Si je veux tester comp-a de cette façon:
TestBed.configureTestingModule({
declarations: [comp-A],
imports: [ReactiveFormsModule],
}).overrideComponent(FAQListComponent, {
set: {
providers: [
{ provide: comp-AService, useValue: comp-AListSVC }
]
}
})
.compileComponents();
cela ne fonctionnerait pas correctement. Moi aussi:
TestBed.configureTestingModule({
declarations: [comp-A, comp-B],
imports: [ReactiveFormsModule],
}).overrideComponent(FAQListComponent, {
set: {
providers: [
{ provide: comp-AService, useValue: comp-AListSVC }
]
}
})
.compileComponents();
Cela ne fonctionne pas aussi parce que comp-b n'a pas ses propres dépendances. Et là, je suis confus. Comment puis-je effectuer des tests unitaires si je dois importer et remocker tous les autres composants à chaque fois? Cela ressemble à une très grosse quantité de travail. Y a-t-il un autre moyen? Quelle serait la meilleure pratique pour tester les composants avec des composants imbriqués ayant leurs propres dépendances?
Merci beaucoup,
Stéphane.
Si vous n'avez pas besoin de référencer comp-b
de quelque manière que ce soit dans vos tests, vous pouvez ajouter schemas: [NO_ERRORS_SCHEMA] or [CUSTOM_ELEMENTS_SCHEMA]
à votre configuration TestBed
ou remplacer le modèle de comp-A
et supprimer le tag pour comp-b
.
Si vous devez faire référence à comp-b
, il se peut que vous n’ayez pas besoin de fournir ses dépendances spécifiquement dans un remplacement.
La définition de providers
dans overrideComponent
n'est nécessaire que si la dépendance est fournie dans le composant lui-même. (Si vous avez une liste de fournisseurs dans comp-A.ts
)
disons que comp-b
a besoin d'un comp-AService
et que comp-AService
soit fourni dans votre substitution comp-A
, puisque comp-b
est un enfant de comp-A
, il aura comp-AService
fourni.
Si vous fournissez ces dépendances dans votre app.module
ou à un niveau supérieur à celui du composant, vous n'avez pas besoin de le remplacer. Par exemple, si comp-b
a besoin de comp-AService
& someOtherService
qui sont tous deux fournis dans votre app.module
, votre configuration TestBed
pourrait ressembler à ceci:
TestBed.configureTestingModule({
declarations: [comp-A, comp-B],
imports: [ReactiveFormsModule],
providers: [
{ provide: comp-AService, useValue: comp-AListSVC },
{ provide: someOtherService, useValue: someOtherServiceSVC }
]
})
Modifier:
Vous pouvez en savoir plus sur les tests de composants imbriqués ici:
Suivant un conseil de @yurzui:
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [comp-a],
schemas: [NO_ERRORS_SCHEMA]
})
.compileComponents();
}));