Я создаю юнит-тесты для угловых 7 компонентов. У меня есть компонент, который
содержит ngOnInit () для вызова функции данных getUser этого компонента.
Файл компонента:
ngOnInit() {
this.getUserDetails(); // If commented test runs successfully
}
getUserDetails() {
this.guestUserService.getData().subscribe(
result => {
this.profileForm = this.fb.group({
firstName: [result['data']['firstname'], Validators.compose([Validators.required, Validators.pattern('^[a-zA-Z ]+$')])],
lastName: [result['data']['lastname'], Validators.compose([Validators.required, Validators.pattern('^[a-zA-Z ]+$')])],
username: [{ value: result['data']['username'], disabled: true }, Validators.compose([Validators.required, Validators.email])]
});
this.imageURL = result['data']['imageFile'];
}
);
}
Создан пример модульного теста для функции getUserDetails ()
let guestUserService: any;
let guestUserServiceSpy: any;
TestBed.configureTestingModule({
providers: [
{ provide: GuestUserService, useValue: guestUserService }]
})
it('should get user data and create profile form when getUserDetails called', () => {
guestUserServiceSpy = guestUserService.getData.and.returnValue(of({
data: { firstname: 'ABC', lastname: 'XYZ', username: 'ABC@XYZ', imageFile: 'http://imagefile.XYZ.com' }
}
));
spyOn(component, 'getUserDetails').and.callThrough();
component.getUserDetails();
fixture.detectChanges();
expect(guestUserService).toBeDefined();
expect(guestUserServiceSpy).toBeDefined();
expect(component.getUserDetails).toHaveBeenCalledTimes(1);
expect(guestUserServiceSpy).toHaveBeenCalledTimes(1);
expect(component.profileForm.valid).toBeTruthy();
expect(component.profileForm.controls['username'].value).toEqual('ABC@XYZ');
});
Во время выполнения теста ng для запуска этого теста сначала вызывается компонент ngOnInit, который выдает ошибку:
TypeError: Невозможно прочитать свойство 'subscribe' с неопределенным ожидаемым шпионом GuestUserService.getData, который был вызван один раз. Это называлось 2
раз.
Если я удалю вызов функции "getUserDetails ()", тестовый запуск будет выполнен успешно.
Любое лучшее решение для такого поведения или я что-то упустил.