Used Angular version is 15 and Jasmine is 4.5.0.
Our component page:
export class HomeComponent implements OnInit {
student?: StudentWithBasicProfile;
constructor(
private studentService: StudentService,
private route: ActivatedRoute) { }
ngOnInit(): void {
let studentId = this.route.snapshot.params['id'];
this.studentService.getStudentBasicProfile(studentId)
.subscribe(student => {
this.student = student;
});
}
}
This component retrieves an id from query string then call a method of a service then display the result.Our tests look like this:
describe('HomeComponent', () => {
let component: HomeComponent;
let fixture: ComponentFixture<HomeComponent>;
let studentServiceSpy: jasmine.SpyObj<StudentService>;
let response: StudentWithBasicProfile;
let routeId: number = 123;
beforeEach(async () => {
studentServiceSpy = jasmine.createSpyObj('StudentService', ['getStudentBasicProfile']);
response = {
studentId: routeId,
firstName: '',
lastName: '',
email: '',
mobilePhone: ''
};
studentServiceSpy.getStudentBasicProfile.and.returnValue(of(response));
await TestBed.configureTestingModule({
declarations: [HomeComponent],
providers: [
{ provide: StudentService, useValue: studentServiceSpy },
{ provide: ActivatedRoute, useValue: { snapshot: { params: { 'id': routeId } } } } // this one is to fake "this.route.snapshot.params['id']" code
]
})
.compileComponents();
fixture = TestBed.createComponent(HomeComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
it("should call getStudentBasicProfile() with correct parameter and return data", () => {
expect(studentServiceSpy.getStudentBasicProfile).toHaveBeenCalledTimes(1);
expect(studentServiceSpy.getStudentBasicProfile).toHaveBeenCalledWith(routeId);
expect(component.student).toEqual(response);
});
});
On lines 4, 9, and 17, we set up a fake StudentService and its function 'getStudentBasicProfile' and set up a return value. Then on line 22, we use this fake service instead of the real service.On line 23, we fake the query string value in route with "{ snapshot: { params: { 'id': [VALUE] } } }".

No comments:
Post a Comment