如何测试 useState 钩子是否已被 jest 和 react 测试库调用?
how can I test if useState hook has been called with jest and react testing library?
我想使用 Jest 和 React 测试库测试这个组件:
export function GenericDivider({ stepsHeader = [], componentsFactory = [] }) {
const [currentPage, changePage] = useState(0);
const Component = componentsFactory[currentPage] || (() => <></>);
return (
<div className="container page__container">
...
<a
href="#"
key={name}
onClick={e => {
e.preventDefault();
if (index < componentsFactory.length) changePage(index);
}}
className={`nav-link ${currentPage === index && 'active'}`}
>
{name}
</a>
...
</div>
);
}
export default memo(GenericDivider);
我想测试当我点击时是否调用了 changePage,有没有办法使用 Jest 和 React 测试库来做到这一点?
我是测试新手,我尝试过这个但它似乎不起作用
it('Should call changePage when button clicked', () => {
const changePage = jest.fn();
const { container } = render(
<GenericDivider
stepsHeader={['hamid', 'walid', 'khalid']}
componentsFactory={[() => <></>, () => <></>, () => <></>]}
/>,
);
const button = container.querySelector('a');
fireEvent.click(button);
expect(changePage).toHaveBeenCalled();
});
简答:不要。
测试内部状态变量非常违背 react-testing-library 背后的理念。该库专注于用户,以及用户可以看到的内容。用户没有状态变量的概念。与其测试它,不如想想用户会看到的变化,并对此进行测试。 UI 是如何更新的?显示了哪些不同的标记或样式?站在用户的角度思考如何测试,你就会找到答案。
查看 react-testing-library 的 Guiding Principles for more context. Then take a look through this page 指南,了解哪些查询对您的用例最有意义。
我想使用 Jest 和 React 测试库测试这个组件:
export function GenericDivider({ stepsHeader = [], componentsFactory = [] }) {
const [currentPage, changePage] = useState(0);
const Component = componentsFactory[currentPage] || (() => <></>);
return (
<div className="container page__container">
...
<a
href="#"
key={name}
onClick={e => {
e.preventDefault();
if (index < componentsFactory.length) changePage(index);
}}
className={`nav-link ${currentPage === index && 'active'}`}
>
{name}
</a>
...
</div>
);
}
export default memo(GenericDivider);
我想测试当我点击时是否调用了 changePage,有没有办法使用 Jest 和 React 测试库来做到这一点?
我是测试新手,我尝试过这个但它似乎不起作用
it('Should call changePage when button clicked', () => {
const changePage = jest.fn();
const { container } = render(
<GenericDivider
stepsHeader={['hamid', 'walid', 'khalid']}
componentsFactory={[() => <></>, () => <></>, () => <></>]}
/>,
);
const button = container.querySelector('a');
fireEvent.click(button);
expect(changePage).toHaveBeenCalled();
});
简答:不要。
测试内部状态变量非常违背 react-testing-library 背后的理念。该库专注于用户,以及用户可以看到的内容。用户没有状态变量的概念。与其测试它,不如想想用户会看到的变化,并对此进行测试。 UI 是如何更新的?显示了哪些不同的标记或样式?站在用户的角度思考如何测试,你就会找到答案。
查看 react-testing-library 的 Guiding Principles for more context. Then take a look through this page 指南,了解哪些查询对您的用例最有意义。