Jasmine / Angular: невозможно прочитать свойство 'patchValue' из неопределенного (тестирование компонента) - PullRequest
0 голосов
/ 29 июня 2018

В моем модульном тесте я проверяю, вызывается ли моя служба. У меня есть функция с именем loadUser (). Эта функция использует сервис getData, чтобы извлечь всех пользователей из URL. Затем он загружает в форму идентификатор пользователя и информацию о конкретном пользователе (имя, фамилия и т. Д.). С этого момента пользователю разрешено редактировать свои учетные данные. Эта функция использует patchValue для отображения данных в правильном поле формы. Сейчас я только пытаюсь проверить, вызван ли мой сервис, getData и все. При выполнении теста я получаю эту ошибку: TypeError: Cannot read property 'patchValue' of undefined. Я хотел бы в своем тесте сказать, что getData был вызван. Вот мой тест, а ниже - моя функция (для краткости я выложил только необходимый код). Я опубликовал свои настройки, потому что, может быть, я что-то там упустил?

Spec:

    fdescribe('User Component', () => {
    let httpService: HttpService;
    let userComponent: UserComponent
    let fixture: ComponentFixture<UserComponent>
    let debugElement: DebugElement;

beforeEach(async() => {
    TestBed.configureTestingModule({
      declarations: [
        UserComponent, 
      ],
      imports: [HttpModule, FormsModule,ReactiveFormsModule],
      providers: [
          HttpService
      ],
  }).compileComponents();
});

beforeEach(() => {
     fixture = TestBed.createComponent(UserComponent);
     userComponent = fixture.componentInstance;
     debugElement = fixture.debugElement;
     httpService = debugElement.injector.get(HttpService);

fit('should have getUsers() call the service GetData()', inject([HttpService], fakeAsync((httpService) => {
    let url = AppConfig.URL_UserById'

    let getDataSpy= spyOn(httpService,'getData').and.returnValue(Observable.of(url));
        userComponent.loadUser();
     expect(getDataSpy).toHaveBeenCalled();
   })))
})

Компонент:

  loadUser() {
this.httpService.getData(AppConfig.URL_UserById + "?UserID=" + this.userId)
  .catch((error: Response | any) => {
    this.showAlertWindow(this.exceptionMessage);
    console.error(error.message || error);
    return Observable.throw(error.message || error);
  })
  .subscribe((res: any) => {
    this.frmUser.patchValue({

      FirstName: res.FirstName,
      MiddleName: res.MiddleName,
      EmailAddress: res.EmailAddress,
      LastName: res.LastName

    });
    this.setUserAccess(res.UserAccessDetail)

  });

Теперь, если я закомментирую строку this.frmUser.patchValue){FirstName...}, тест пройден и успешно проверяет, вызван ли getData (). Так что я предполагаю, что мне нужно инициировать patchValue или что-то в этом роде. Спасибо.

1 Ответ

0 голосов
/ 30 июня 2018

Простое решение проблемы. В моем компоненте ngOnInit я создаю свою форму пользователя. Все, что мне нужно было сделать, это сделать userComponent.ngOnInit() и тест пройден.

полный код для рабочего теста:

fit('should have getUsers() call the service GetData()', inject([HttpService], fakeAsync((httpService) => {

    let url = AppConfig.URL_UserById + "?UserID=" + this.userId

    let getDataSpy= spyOn(httpService, 'getData').and.returnValue(Observable.of(url));

   userComponent.ngOnInit();
   userComponent.loadUser();

        expect(getDataSpy).toHaveBeenCalled();

   })))
})
...