ошибка типа: this.notificationeventservice.shownotification.subscribe

#javascript #angular #unit-testing #jasmine #karma-jasmine

#javascript #угловой #модульное тестирование #жасмин #карма-жасмин

Вопрос:

файл componenet

 ngOnInit(): void {
 this.subscribeNotification();
}
subscribeNotification {
  this.notificationEventService.showNotification.subscribe((data: NotificationData) => {
    console.log(data);
  });
}
  

Файл службы

 import { EventEmitter, Injectable } from '@angular/core';

@Injectable()
export class NotificationEventService {
   public notificationCounter = 0;

   showNotification = new EventEmitter();

   notifySuccess(message: string) {
   const data = { type: 'banner', severity: 'success', discreet: false, text: message };
   this.showNotification.emit(data);
}
 }
  

файл спецификации для компонента

 const notificationEventServiceStub = () => ({
  showNotification: ()  => ({ subscribe: f => f({}) })
});
TestBed.configureTestingModule({
  imports: [HttpClientTestingModule],
  providers: [{ provide: NotificationEventService, useFactory: notificationEventServiceStub}]
});
describe('ngOnInit', () => {
it('makes expected calls', () => {
  spyOn(component, 'subscribeNotification').and.callThrough();
  component.ngOnInit();
  expect(component.subscribeNotification).toHaveBeenCalled();
});
});
  

как только я слежу за этой функцией ngOnInit, я получаю

Ошибка типа: this.notificationEventService.showNotification.subscribe не является функцией

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

1. Вы должны следить за subscribe методом EventEmitter , а не за EventEmitter объектом.

2. добавили ли вы услугу в провайдере модуля

3. Да, я добавил на самом деле эту ошибку, которую я получаю в jasmine

Ответ №1:

Есть лучший способ сделать это, вы можете использовать BehaviourSubject rxjs и подписаться на него.
Чтобы изменить его значение, вы должны использовать метод next() вместо метода emit(), вот и все, что вам нужно.
Вот пример того, как использовать ссылочную ссылку на тему поведения RXJS

Надеюсь, это поможет, счастливого кодирования 🙂

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

1. Разве это невозможно с помощью event emmiteer?