#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?