Javascript 每次运行组件的单元测试用例时,都会调用组件的angular7: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 => {

我正在为angular 7组件创建单元测试用例。我有一个组件 包含用于调用该组件的getUser data函数的ngOnInit()

组件文件:

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');
  });