Выяснение, как смоделировать изменение размера окна для теста реагирующего компонента

Поэтому, когда компонент монтируется, у меня есть прослушиватель событий, который прослушивает события изменения размера. Он переключает состояние isMobileView и затем передает его дочерним элементам в качестве реквизита. Так что обязательно, что это работает и проверено. Я довольно новичок в тестировании, и я пытаюсь найти способ, которым я могу написать тест, который изменяет размеры окна и заставляет всю логику выполняться и проверять, что оно выполнено так, как должно.

Вот код -

componentDidMount() {
    this.setMobileViewState()
    window.addEventListener('resize', this.setMobileViewState.bind(this));
}

setMobileViewState() {
    if(document.documentElement.clientWidth <= this.props.mobileMenuShowWidth) {
        this.setState({ isMobileView: true })
    } else {
        this.setState({ isMobileView: false })
    }
}

Я знаю, что код работает, но я хочу написать для него тест. В основном только то, что гарантирует, что состояние изменяется правильно.

7 ответов

Используя Jest и Enzyme вы можете сделать следующее. В Jest есть JSDOM. В ваших тестах Jest предоставляет window объект, и он представлен global (Я думаю, что по умолчанию window.innerWidth устанавливается Jest 1024px):

test('Test something when the viewport changes.', () => {

    // Mount the component to test.
    const component = mount(<ComponentToTest/>);

    ...

    // Change the viewport to 500px.
    global.innerWidth = 500;

    // Trigger the window resize event.
    global.dispatchEvent(new Event('resize'));

    ...

    // Run your assertion.
});

Если вы получаете сообщение об ошибке машинописи

Невозможно присвоить 'innerWidth', потому что это свойство только для чтения.

Пытаться:

Object.defineProperty(window, 'innerWidth', {writable: true, configurable: true, value: 200})

Попробуйте эту строку:

window = Object.assign(window, { innerWidth: 500 });

У меня это сработало с библиотекой тестирования:

        it('should resize', () => {
    const altImage = 'test'

    window.innerWidth = 500

    fireEvent(window, new Event('resize'))

    waitFor(() => {
      expect(screen.getByAltText(altImage)).not.toBeInTheDocument()
    })
  })

Для всех, кто используетreact-testing-library, есть собственный способ добиться этого с помощью fireEvent .

        import { fireEvent } from '@testing-library/react';
  ...

  it('should resize', () => {
    window.innerWidth = 500;
    fireEvent(window, new Event('resize'));

    // your test here
  });

Я сделал это с библиотекой тестирования:

      function fireResize(width) {
  window.innerWidth = width;
  window.dispatchEvent(new Event('resize'));
}

it('some test', async () => {
  ....
  await waitFor(() => {
   fireResize(500);
  });
  ....
});

Источник: https://medium.com/@dawchihliou/testing-react-hooks-6d3ae95cd838 .

      jest.spyOn(window.screen, "width", "get").mockReturnValue(1000);
Другие вопросы по тегам