Невозможно использовать модульный тест ClickCway с ReactTestUtils - PullRequest
1 голос
/ 27 февраля 2020

Я пытаюсь протестировать компонент, который использует useClickAway из react-use.

Это мой компонент:

export default function DropdownMenu(props: DropdownMenuProps) {
  const { className, align, children } = props;
  const dropdownRef = React.useRef(null);
  const [isDropdownActive, setIsDropdownActive] = React.useState(false);
  useClickAway(dropdownRef, () => setIsDropdownActive(false));
  return (
    <div
      data-id="dropdown-parent"
      ref={dropdownRef}
      className={classes(
        "dropdown is-pulled-right",
        align === "right" && "is-right",
        isDropdownActive && "is-active"
      )}
    >
      <div className="dropdown-trigger">
        <button
          data-id="dropdown-button"
          onClick={() => setIsDropdownActive(!isDropdownActive)}
          className={classes("button is-dark is-radiusless", className)}
          aria-haspopup="true"
        >
          <span className="icon is-small">
            <i className="fas fa-ellipsis-v" aria-hidden="true" />
          </span>
        </button>
      </div>
      <div className="dropdown-menu" role="menu">
        <div className={classes("dropdown-content", styles.dropdown)}>
          {children}
        </div>
      </div>
    </div>
  );
}

и это мой тест:

it('gets deactivated when area outside of dropdown is clicked', () => {
  const container = document.createElement('div');
  document.body.appendChild(container);
  ReactTestUtils.act(() => {
    ReactDOM.render(
      <div>
        <button data-id="outside"/>
        <DropdownMenu>
          <div/>
        </DropdownMenu>
      </div>, 
    container);
  })
  const button = container.querySelector('button[data-id="dropdown-button"]') as Element
  const parent = container.querySelector('div[data-id="dropdown-parent"]') as Element
  const outside = container.querySelector('button[data-id="outside"]') as Element
  ReactTestUtils.act(() => {
    ReactTestUtils.Simulate.click(button);
  })
  expect(parent.className).toContain('is-active') //<--- this works
  ReactTestUtils.act(() => {
    ReactTestUtils.Simulate.click(outside);
  })
  expect(parent.className).not.toContain('is-active') //<--- this doesn't
})

Я пытался использовать console.log в useClickAway обратном вызове. Тем не менее, это, кажется, не называется ..

Я что-то упустил?

1 Ответ

0 голосов
/ 23 марта 2020

useClickAway использует mousedown событие: https://github.com/streamich/react-use/blob/v13.27.0/src/useClickAway.ts#L4

С библиотекой реагирующего тестирования:

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

test('click away', () => {
  const { getByText } = render(<MyComponent />);

  // Does not work
  //getByText('outside').click();

  // Does work
  fireEvent.mouseDown(getByText('outside'));
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...