I am opening my mat-dialog with the following function:
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']);
});
}
});
}
I am attempting to write a test for this function that simply fires the afterClosed() so that I can check if my service method that makes a backend call is called.
component.spec.ts (beforeEach Testbed creation)
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();
});
The test currently fails with a "Expected spy acceptLead to have been called." I am failing on understanding how to test the function and execute some sort of mock MatDialogRef so that I can check if the conditions of my test pass.
Any help/suggestions would be much appreciated
I think you are missing the whole point of unit testing the component. From my understanding:
accept()
which creates subscription to the closing event ofthis.dialog
dialogRef
global tocomponent
rather than keeping it private toaccept()
. This would help you test your code better.private
variables can't be access during unit testing.So:
component.ts
spec.ts
You can test Angular Material Dialog's afterClosed method this way:
import { of } from 'rxjs';
afterClosed()
methodBasically, the
afterClosed()
of the dialogRef is expecting an Observable. So we spy on the component's dialog open method and return an Observable for theafterClosed()
method by using theof
operator fromrxjs
.You can then replace the
of(true)
from thereturnValue
with your own data what you are sending in theafterClosed()
of the dialog in the main component.