Как протестировать событие нажатия клавиши в компоненте MenuList материала с использованием библиотеки Resact-Testing - PullRequest
1 голос
/ 27 февраля 2020

У меня есть следующий компонент MenuList, на котором я хочу проверить событие нажатия клавиши.

Компонент :

import MenuItem from '@material-ui/core/MenuItem';
import MenuList from '@material-ui/core/MenuList';
import * as React from 'react';

export default function App() {
  return (
    <div>
      <MenuList autoFocusItem={true}>
        <MenuItem>option 1</MenuItem>
        <MenuItem>option 2</MenuItem>
        <MenuItem>option 3</MenuItem>
      </MenuList>
    </div>
  );
}

Test :

import {
    fireEvent,
    render,
} from 'test-utils';
import React from 'react';
import TestMenuList from './TestMenuList';

test('that on key down press, the focus on menu list item moves down', async () => {
    // Render component
    const { getAllByRole, getByRole } = render(<TestMenuList />, {});

    let MenuItem1 = getAllByRole('menuitem')[0];
    expect(MenuItem1.classList.contains('Mui-focusVisible')).toBe(true); // assert 1

    const Menu = getByRole('menu');
    fireEvent.keyDown(Menu, { Key: 'ArrowDown', code: 40 });

    MenuItem1 = getAllByRole('menuitem')[0];
    const MenuItem2 = getAllByRole('menuitem')[1];
    expect(MenuItem1.classList.contains('Mui-focusVisible')).toBe(false); // assert 2
    expect(MenuItem2.classList.contains('Mui-focusVisible')).toBe(true); // assert 3
});

Чтобы убедиться, что пункт меню находится в фокусе, я проверяю, есть ли у пункта меню класс Mui-focusVisible. Поскольку я установил autoFocusItem={true} в MenuList, первый элемент меню должен автоматически добавить класс Mui-focusVisible. Это утверждение утверждения 1, которое проходит.

    let MenuItem1 = getAllByRole('menuitem')[0];
    expect(MenuItem1.classList.contains('Mui-focusVisible')).toBe(true); // assert 1

Затем я запустил событие нажатия клавиши в меню

    const Menu = getByRole('menu');
    fireEvent.keyDown(Menu, { Key: 'ArrowDown', code: 40 });

И проверил, был ли класс Mui-focusVisible удален из первого пункт меню и добавлен во второй пункт меню. Теперь тест не пройден в утверждениях утверждений 2 и 3.

    MenuItem1 = getAllByRole('menuitem')[0];
    const MenuItem2 = getAllByRole('menuitem')[1];
    expect(MenuItem1.classList.contains('Mui-focusVisible')).toBe(false); // assert 2
    expect(MenuItem2.classList.contains('Mui-focusVisible')).toBe(true); // assert 3

Я зарегистрировал classList для MenuItem1 и MenuItem2, чтобы увидеть, удаляется ли Mui-focusVisible из первого пункта меню и добавляется в 2-й пункт меню после события нажатия клавиши. Но класс Mui-focusVisible все еще находится в первом пункте меню, а не во втором.

Я попытался добавить await wait().

fireEvent.keyDown(Menu, { Key: 'ArrowDown', code: 40 });
await wait();

, обертывающий экран с act(() => {}),

act(() => fireEvent.keyDown(Menu, { Key: 'ArrowDown', code: 40 }));
await wait()

событием нажатия клавиши первого элемента списка меню вместо самого меню.

act(() => fireEvent.keyDown(MenuItem1, { Key: 'ArrowDown', code: 40 }));
await wait()

Никто из них не работал. Я создал codesandbox для этого компонента, и здесь, кажется, он отлично работает в пользовательском интерфейсе. Но тест не пройден.

1 Ответ

0 голосов
/ 27 февраля 2020

Я рекомендую просмотреть интеграционные тесты для MenuList: https://github.com/mui-org/material-ui/blob/v4.9.4/packages/material-ui/test/integration/MenuList.test.js.

. Навигация с клавиатуры проверена очень тщательно. Однако вы обнаружите, что он в первую очередь проверяет, имеет ли элемент фокус, а не проверяет Mui-focusVisible. Фокусно-видимая логика c (https://github.com/mui-org/material-ui/blob/v4.9.4/packages/material-ui/src/utils/focusVisible.js) зависит от отслеживания событий мыши и клавиатуры на уровне документа, и ее непросто надежно вызвать в рамках тестов (хотя вы можете посмотреть на тесты). для видимых в фокусе логи c здесь: https://github.com/mui-org/material-ui/blob/v4.9.4/packages/material-ui/src/utils/focusVisible.test.js). Я бы порекомендовал провести ваши тесты вне фокуса и полагаться на Material-UI для управления и тестирования с применением класса Mui-focusVisible.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...