Угловой 7: ngOnInit () компонента a вызывается каждый раз при запуске модульного теста этого компонента - PullRequest
0 голосов
/ 04 июля 2019

Я создаю юнит-тесты для угловых 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 ()", тестовый запуск будет выполнен успешно.

Любое лучшее решение для такого поведения или я что-то упустил. enter image description here

1 Ответ

1 голос
/ 04 июля 2019

Он вызывается дважды, потому что у вас есть component.getUserDetails() и fixture.detectChanges() в тестовом примере.

fixture.detectChanges() сработает ngOnInit(), и у вас уже есть getUserDetails() в методе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...