J'ouvre mon mat-dialogue avec la fonction suivante:
accept() {
let dialogRef = this.dialog.open(AcceptDialogComponent, {
data: {
hasAccepted: false
}
})
dialogRef.afterClosed().subscribe(result => {
console.log(result);
if (result.hasAccepted === true) {
this.leadService.acceptLead(this.holdingAccountId, this.lead.id)
.pipe(
takeUntil(this.onDestroy$)
)
.subscribe (acceptLeadRes => {
console.log(acceptLeadRes);
this.leadService.updateLeadAction('accept');
},
(err: HttpErrorResponse) => {
console.log(err);
this.router.navigate(['/error']);
});
}
});
}
J'essaie d'écrire un test pour cette fonction qui déclenche simplement l'afterClosed () afin que je puisse vérifier si ma méthode de service qui effectue un appel principal est appelée.
component.spec.ts (avant chaque création de banc d'essai)
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ LeadCardComponent, AcceptDialogComponent ],
imports: [
requiredTestModules,
JwtModule.forRoot({
config: {
tokenGetter: () => {
return '';
}
}
})
],
providers: [
ApplicationInsightsService,
JwtHelperService,
// { provide: LeadsService, useValue: leadServiceSpy }
],
}),
TestBed.overrideModule(BrowserDynamicTestingModule, {
set: {
entryComponents: [ AcceptDialogComponent ]
}
});
TestBed.compileComponents();
}));
component.spec.ts (test)
it('Return from AcceptLeadDialog with hasAccepted equals true should call acceptLead endpoint', () => {
let matDiaglogref = dialog.open(AcceptDialogComponent, {
data: {
hasAccepted: false
}
});
spyOn(matDiaglogref, 'afterClosed').and.callThrough().and.returnValue({ hasAccepted: true });
spyOn(leadService, 'acceptLead').and.callThrough();
component.acceptLead();
fixture.detectChanges();
matDiaglogref.close();
fixture.detectChanges();
expect(leadService.acceptLead).toHaveBeenCalled();
});
Le test échoue actuellement avec un "espion accepté que le chef de file ait été appelé". Je n'arrive pas à comprendre comment tester la fonction et exécuter une sorte de maquette MatDialogRef afin de pouvoir vérifier si les conditions de mon test réussissent.
Toute aide/suggestion serait très appréciée
Je pense que vous manquez tout le point d'unité de test du composant. De ma compréhension:
accept()
qui crée un abonnement à l'événement de fermeture de this.dialog
dialogRef
global à component
plutôt que de le garder privé à accept()
. Cela vous aiderait à mieux tester votre code. private
les variables ne sont pas accessibles pendant les tests unitaires.Alors:
component.ts
accept() {
this.dialogRef = this.dialog.open(AcceptDialogComponent, {
data: {
hasAccepted: false
}
})
this.dialogRef.afterClosed().subscribe(result => {
console.log(result);
if (result.hasAccepted === true) {
this.leadService.acceptLead(this.holdingAccountId, this.lead.id)
.pipe(
takeUntil(this.onDestroy$)
)
.subscribe (acceptLeadRes => {
console.log(acceptLeadRes);
this.leadService.updateLeadAction('accept');
},
(err: HttpErrorResponse) => {
console.log(err);
this.router.navigate(['/error']);
});
}
});
}
spec.ts
it('should create subscription to Modal closing event and call "acceptLead()" of "leadService" ', () => {
spyOn(component.dialogRef, 'afterClosed').and.returnValue(
of({
hasAccepted: false
})
);
spyOn(component.leadService, 'acceptLead').and.callThrough();
component.accept();
expect(component.dialogRef).toBeDefined();
expect(component.dialogRef.afterClosed).toHaveBeenCalled();
expect(component.leadService.acceptLead).toHaveBeenCalled();
});