Javascript 每次运行组件的单元测试用例时,都会调用组件的angular7:ngOnInit()
我正在为angular 7组件创建单元测试用例。我有一个组件 包含用于调用该组件的getUser data函数的ngOnInit() 组件文件:Javascript 每次运行组件的单元测试用例时,都会调用组件的angular7:ngOnInit(),javascript,angular,typescript,unit-testing,karma-jasmine,Javascript,Angular,Typescript,Unit Testing,Karma Jasmine,我正在为angular 7组件创建单元测试用例。我有一个组件 包含用于调用该组件的getUser data函数的ngOnInit() 组件文件: ngOnInit() { this.getUserDetails(); // If commented test runs successfully } getUserDetails() { this.guestUserService.getData().subscribe( result => {
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()创建了单元测试用例
运行测试以运行此测试用例时,首先调用组件的ngOnInit并给出错误:
TypeError:无法读取未定义的spy GuestUserService.getData的属性“subscribe”,该属性已被调用一次。它叫2
时代
如果删除对函数“getUserDetails()”的调用,测试用例将成功运行
有没有更好的办法来处理这种行为,否则我就错过了什么。
它调用了两次,因为测试用例中有
组件.getUserDetails()
和fixture.detectChanges()
fixture.detectChanges()
将触发ngOnInit()
,并且方法中已经有getUserDetails()
。它调用了两次,因为测试用例中有组件.getUserDetails()
和fixture.detectChanges()
fixture.detectChanges()
将触发ngOnInit()
,并且方法中已经有了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');
});