@tostershmoster

Как исправить ошибку «No overload matches this call» в jest.spyOn на приватном методе?

private getPosOnScale(currentPos: number): number {
  const sliderRect = this.slider.element!.getBoundingClientRect();

  return this.settings.isVertical
    ? currentPos - sliderRect.top
    : currentPos - sliderRect.left;
}


describe('some method', () => {
  test('should return smth', () => {
    const view = new View('range-slider', settings);
    jest.spyOn(view, 'getPosOnScale').mockReturnValue(100);
    // code
  });
});


на приватном методе getPosOnScale получаю ошибку

No overload matches this call.
Overload 1 of 4, '(object: View, method: FunctionPropertyNames>): SpyInstance', gave the following error.
Argument of type '"getPosOnScale"' is not assignable to parameter of type 'FunctionPropertyNames>'.
Overload 2 of 4, '(object: View, method: never): SpyInstance', gave the following error.
Argument of type 'string' is not assignable to parameter of type 'never'.ts(2769)


если метод сделать public ошибки нет
  • Вопрос задан
  • 530 просмотров
Решения вопроса 1
bingo347
@bingo347 Куратор тега TypeScript
Crazy on performance...
jest.spyOn имеет 4 перегрузки, которые отделяют обычные поля (в этих перегрузках есть 3й параметр 'get' | 'set'), методы (функциональный тип на инстансе) и static методы (функциональный тип на самом классе).
Ваш вызов подразумевает как раз метод.
Проблема в том, что private и protected поля не матчатся как функциональные типы. Приватные поля вообще не имеют типа за пределами класса, а protected имеют тип только в наследнике.

Остается только обмануть систему типов:
declare class ViewHack {
  getPosOnScale(currentPos: number): number;
}
describe('some method', () => {
  test('should return smth', () => {
    const view = new View('range-slider', settings);
    jest.spyOn(view as unknown as ViewHack, 'getPosOnScale').mockReturnValue(100);
  });
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы