Как протестировать опрос с помощью таймера rxjs?

#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. Спасибо за ответ. Я нашел другие проблемы, но вы помогли мне решить эту.