#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 (), это была ошибка =) спасибо за вашу помощь и потраченное время