#angular #timer #rxjs #jestjs #observable
Вопрос:
У меня есть угловой компонент, в котором я провел опрос в ngOnInit с помощью таймера rjxs, вот так:
ngOnInit() {
timer(0, 60000). subscribe(() => {
this.getSomeStuff();
}
}
В шутку у меня есть шпион за функцией:
const getSomeStuff = jest.spyOn( component, 'getSomeStuff' );
Моя цель-проверить, сколько раз вызывалась функция «getSomeStuff».
Например:
- через 0 миллисекунд:
ожидайте(становится лучше).toHaveBeenCalledTimes(1);
должно быть правдой.
- через 60000 миллисекунд (минута):
ожидайте(становится лучше).toHaveBeenCalledTimes(2);
должно быть правдой.
Но никто не работает, ожидание проходит только с 0, и я не понимаю, почему. Я попробовал с помощью fakeAsync anch tick(), я попробовал с помощью VirtualScheduler и все, что я нашел по другим вопросам, но, похоже, с моим делом ничего не работает.
У кого-нибудь есть другой подход, чтобы попробовать?
Ответ №1:
Проблема в том, что вы, вероятно, запускаете таймер ngOnInit
.
Если вы вызовете fixture.detectChanges()
beforeEach
крючок, таймер уже запустится, прежде чем вы сможете следить за функцией, которая должна быть вызвана.
Поэтому либо вы перемещаете таймер в функцию, которую затем вызываете, ngOnInit
либо вам нужно изменить свои тесты, чтобы вызывать fixture.detectChanges()
каждый тест (см. Ниже).
Кроме того, вы должны позвонить ngOnDestroy
или отказаться от подписки на таймер в конце каждого теста, иначе вы получите сообщение об ошибке, например 1 periodic timer(s) still in the queue.
.
Таким образом, ваши тесты могут выглядеть следующим образом:
beforeEach(async () => {
// other setup...
fixture = TestBed.createComponent(AppComponent);
component = fixture.componentInstance;
// don't call fixture.detectChanges() here.
});
it('test 1', fakeAsync(() => {
const spy = spyOn(component, 'doStuff');
fixture.detectChanges();
tick(0);
expect(spy).toHaveBeenCalledTimes(1);
component.ngOnDestroy();
}));
Комментарии:
1. Спасибо за ответ. Я нашел другие проблемы, но вы помогли мне решить эту.