Проверить состояние перехватчиков реакции с помощью библиотеки хуков Jest и React
Затем компонент I nav будет переключать состояние на боковой панели, а также открывать и закрывать меню, а затем пытаться получить этот проход в покрытии кода. Когда я вхожу в свой тест, мое состояние продолжает отображаться как неопределенное. Не знаю, как с этим справиться.
Component.js:
const Navigation = (props) => {
const {
classes,
...navProps
} = props;
const [anchorEl, setanchorEl] = useState(null);
const [sidebarOpen, setsidebarOpen] = useState(false);
const toggleSidebar = () => {
setsidebarOpen(!sidebarOpen);
};
const toggleMenuClose = () => {
setanchorEl(null);
};
const toggleMenuOpen = (event) => {
setanchorEl(event.currentTarget);
};
return (
<Fragment>
<Button
onClick={toggleMenuOpen}
/>
<SideMenu
toggleSidebar={toggleSidebar}
>
<Menu
onClose={toggleMenuClose}
>
</SideMenu>
</Fragment>
);
};
export default Navigation;
Test.js:
import { renderHook, act } from '@testing-library/react-hooks';
// Components
import Navigation from './navigation';
test('sidebar should be closed by default', () => {
const newProps = {
valid: true,
classes: {}
};
const { result } = renderHook(() => Navigation({ ...newProps }));
expect(result.current.sidebarOpen).toBeFalsy();
});
1 ответ
Автор react-hooks-testing-library
Вот.
react-hooks-testing-library
не для тестирования компонентов и опроса внутреннего состояния перехвата для подтверждения их значений, а для тестирования пользовательских перехватчиков реакции и взаимодействия с результатом перехвата, чтобы убедиться, что он ведет себя так, как вы ожидаете. Например, если вы хотите извлечьuseMenuToggle
крючок, который выглядел примерно так:
export function useMenuToggle()
const [anchorEl, setanchorEl] = useState(null);
const [sidebarOpen, setsidebarOpen] = useState(false);
const toggleSidebar = () => {
setsidebarOpen(!sidebarOpen);
};
const toggleMenuClose = () => {
setanchorEl(null);
};
const toggleMenuOpen = (event) => {
setanchorEl(event.currentTarget);
};
return {
sidebarOpen,
toggleSidebar,
toggleMenuClose,
toggleMenuOpen
}
}
Тогда вы можете проверить это с помощью renderHook
:
import { renderHook, act } from '@testing-library/react-hooks';
// Hooks
import { useMenuToggle } from './navigation';
test('sidebar should be closed by default', () => {
const newProps = {
valid: true,
classes: {}
};
const { result } = renderHook(() => useMenuToggle());
expect(result.current.sidebarOpen).toBeFalsy();
act(() => {
result.current.toggleSidebar()
})
expect(result.current.sidebarOpen).toBeTruthy();
});
Однако, как правило, когда ловушка используется только одним компонентом и / или в одном контексте, мы рекомендуем вам просто протестировать компонент и разрешить проверку ловушки через него.
Для тестирования вашего Navigation
компонент, вам следует взглянуть на react-testing-library
вместо.
import React from 'react';
import { render } from '@testing-library/react';
// Components
import Navigation from './navigation';
test('sidebar should be closed by default', () => {
const newProps = {
valid: true,
classes: {}
};
const { getByText } = render(<Navigation {...newProps} />);
// the rest of the test
});