как протестировать функцию внутри инструкции if jasmin karma angular

#angular #unit-testing #karma-jasmine #karma-runner #angular7

#angular #модульное тестирование #karma-jasmine #karma-runner #angular7

Вопрос:

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

  getListStudents() {
this.noteService.getStudents({}).subscribe(res => {
  this.students= res
})}
  

затем я вызываю эту функцию в ngOnInit()

  if(this.currentUser.Type == 'Teacher'){
this.getListStudents()
}
  

без инструкции if тест корректен, но с инструкцией if он сломался

это мой тест

   it('should call the service  getStudents', () => {
component.currentUser={ "Type": "Teacher"}
let mock = [{
  "ID": 22,
  "name": "paul"
}]
let service: NoteService = TestBed.get(NoteService);
  spyOn(service, 'getListStudents').and.returnValue(of(mock));
  fixture.detectChanges();
  expect(component.students.length).toBe(1)
 });
  

я получил сообщение об ошибке Не удается прочитать свойство ‘Type’, равное null, и когда я удаляю инструкцию if из ngOnInit, она работает так, как ожидалось, что я делаю не так?
Пожалуйста, предложите мне решения для решения этой проблемы. спасибо

Комментарии:

1. Может быть, вы можете использовать fixture.detectChanges(); после определения component.CurrentUser? Я надеюсь, что это поможет.

2. спасибо за ваш ответ =) , но я все еще получаю component.students. длина =0

3. Попробуйте определить component.currentUser={ "Type": "Teacher"} в инструкции beforeEach. У меня это сработало.

4. еще раз спасибо за ваш ответ =) он сломался после fixture.DetectChanges (); и я получил ошибку TypeError: не удается прочитать свойство ‘Type’, равное null

5. Вам нужно инициализировать свойство CurrentUser в constructor()

Ответ №1:

Используйте синхронное тестирование, как показано в документах

 it('should call the service  getStudents', fakeAsync(() => {
  component.currentUser={ "Type": "Teacher"}
  let mock = [{
    "ID": 22,
    "name": "paul"
  }]
  let service: NoteService = TestBed.get(NoteService);
  spyOn(service, 'getListStudents').and.returnValue(of(mock));
  fixture.detectChanges();
  tick();
  expect(component.students.length).toBe(1)
}));
  

Комментарии:

1. спасибо за ваш ответ =) он сломался после fixture.DetectChanges (); и я получил ошибку TypeError: не удается прочитать свойство ‘Type’ null

2. Это означает, что где-то вы написали this.currentUser = null

3. у меня просто есть один тест в моем spec.ts, и я вызвал component.CurrentUser={ «Type»: «Teacher»} я не понял, почему null и когда я зарегистрировал component.CurrentUser. Введите тест, который содержит Учитель

4. Ваш компонент может изменить значение. null это очень специфическое значение, которое нельзя принимать неявно: если оно равно null, то вы, вероятно, где-то его установили!

5. я должен инициализировать свойство CurrentUser в constructor (), это была ошибка =) спасибо за вашу помощь и потраченное время