Как в шутку протестировать целевой instanceof window.Window - PullRequest
0 голосов
/ 30 мая 2020

У меня есть функция, которая выполняет следующее (ПРИМЕЧАНИЕ: здесь используется машинописный текст, следовательно, определения типов вы видите в аргументах) ...

function scroll(target: HTMLElement, {posX, posY}: ScrollPosition): void {
    if (target instanceof window.Window) {
        target.scrollTo(posX, posY);
    } else {
        /* eslint-disable no-param-reassign */
        target.scrollLeft = posX;
        target.scrollTop = posY;
        /* eslint-enable no-param-reassign */
    }
}

При текущей настройке jest, которая у меня есть, она охватывает оператор else, но мне также нужно проверить, когда target instanceof window.Window. Это кое-что из того, что у меня есть, по крайней мере, для того, чтобы шпионить за scrollTo ...

const spyScrollTo = jest.fn();

beforeEach(() => {
    Object.defineProperty(global.window, 'scrollTo', {value: spyScrollTo});
    spyScrollTo.mockClear();
});

... но я не продвинулся достаточно далеко, чтобы понять, как сделать цель проходит как часть window.Window. Я безуспешно пытался возиться с библиотекой jsdom.

1 Ответ

0 голосов
/ 31 мая 2020

window.scrollTo дескриптор свойства должен быть configurable, чтобы его можно было задать несколько раз. Его следует очистить в afterEach, чтобы избежать перекрестного заражения при тестировании.

В настоящее время window === global, а не экземпляр Window в Jest, поэтому он не пройдет условие target instanceof window.Window, которое true в браузере.

Его можно протестировать с помощью заглушенного экземпляра Window:

test('...', () => {
  let mockWindow = Object.create(Window.prototype, { scrollTo: { value: jest.fn() } });
  scroll(mockWindow, {posX: 100, posY: 200});
  expect(mockWindow.scrollTo).toBeCalledWith(100, 200);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...