Как протестировать колбэк внутри стрелочной функции?

private initRangeSlider(): Presenter {
  // ...
  this.view.changeSettingsObserver.addObserver((settings: ISettings) => {
    this.model.updateSettings(settings); // Uncovered Line #s
  });
  return this;
}

Upd: стороки с комментом // добавлено

describe('private initRangeSlider', () => {
  it('should call inner functions', () => {
    document.body.innerHTML = '<div id="range-slider"></div>';

    const model = new Model(settings);
    const view = new View('#range-slider', settings);
    const presenter = new Presenter(model, view);

    const addObserverSpy = jest.spyOn(presenter.view.changeSettingsObserver, 'addObserver');

    /**
     * обнуляем массив обзерверов для теста метода 'initRangeSlider'
     * т.к. туда добавляется обзервер при создании экземляра Presenter
     */
    presenter.view.changeSettingsObserver.observers = []; // добавлено
    presenter['initRangeSlider']();

    expect(addObserverSpy).toBeCalled();

    /**
     * после выполнения presenter['initRangeSlider']();
     * в массиве обзерверов должен быть обзервер
     * т.е. длинна массива обзерверов должна быть больше 0
     */
    const { observers } = presenter.view.changeSettingsObserver; // добавлено

    expect(observers.length).toBeGreaterThan(0); // добавлено
  });
});

Функция addObserverSpy вызывается, но при этом coverage показывает что не покрыт внутрений колбэк. вероятно потому что он не вызывается в этом методе, а только добавляется в массив обзерверов. И мне не понятно как это тестировать. Нужно проитись по массиву обзерверов и проверить что туда добавилась именно этот метод? Так это наверно должно быть в тестах модуля observer?

Как протестировать эту this.model.updateSettings(settings) строку?


Ответы (1 шт):

Автор решения: Иван Хорошевский

Возможно стоит запомнить контекст до выполнения стрелочной функции?

private initRangeSlider(): Presenter {
  // ...
  let that = this;
  this.view.changeSettingsObserver.addObserver((settings: ISettings) => {
    that.model.updateSettings(settings); // Uncovered Line #s
  });
  return this;
}
→ Ссылка