模拟React-Router-dom useHistory和其他带有笑话的钩子

赤脚莫伊斯

我有一个CRA和Typescript(.tsx)应用程序。我正在尝试为需要的组件编写测试useHistoryuseRouteMatch但它返回错误:TypeError: Cannot read property 'history' of undefined

组件:

const SidebarTreeNav: React.FC<Props> = ( { tree, expanded } ) => {
  const history = useHistory();
  let { url } = useRouteMatch();

  const handleClick = useCallback(
    ( path: string ) => history.push(`${ url }/${ path }`),
    [ history ]);

  return (
    <SidebarTreeNavView expanded={ expanded ?? [ '0' ] }>
      <SidebarTreeNavBlock handleClick={ handleClick } tree={ tree } node={ 0 } />
    </SidebarTreeNavView>
  );
};

export default SidebarTreeNav;

考试:

  beforeEach(() => {
    jest.mock('react-router-dom', () => {
      const originalModule = jest.requireActual('react-router-dom');

      return {
        __esModule: true,
        ...originalModule,
        useRouteMatch: { url: '/entry' },
        useHistory: jest.fn(),
      };
    });

    shallow = createShallow();
    wrapper = shallow(<SidebarTreeNav tree={ [] } />);
  });

  it('<SidebarTreeNav /> should be defined', () => {
    expect(wrapper).toBeDefined();
  });

尤林

可能您不再需要此答案,但我会将其发布以供将来参考。

首先,您jest.mock在错误的位置定义了它,它必须是静态的,而不是在每次安装组件之前都进行模拟-这可以解决您的useHistory错误。其次,您useRouteMatch以错误的方式嘲笑了它,这将抛出useRouteMatch不是函数的错误。第三,为什么需要它__esModule: true

无论如何,这是我的工作解决方案(我删除了一些不相关的部分):

SidebarTreeNav组件:

import React, { useCallback } from 'react';
import { useHistory, useRouteMatch } from 'react-router-dom';

const SidebarTreeNav = () => {
  const history = useHistory();
  const { url } = useRouteMatch();

  const handleClick = useCallback(
    (path: string) => history.push(`${url}/${path}`),
    [history]
  );

  // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions
  return <div onClick={() => handleClick(url)}>expanded</div>;
};

export default SidebarTreeNav;

测试文件:

import { shallow, ShallowWrapper } from 'enzyme';
import React from 'react';

import SidebarTreeNav from './SideBarTreeNav';

jest.mock('react-router-dom', () => {
  const originalModule = jest.requireActual('react-router-dom');

  return {
    ...originalModule,
    useHistory: jest.fn(),
    useRouteMatch: jest.fn(() => {
      return { url: '/entry' };
    }),
  };
});

describe('whatever', () => {
  let wrapper: ShallowWrapper;

  beforeEach(() => {
    wrapper = shallow(<Temporary />);
  });

  it('<SidebarTreeNav /> should be defined', () => {
    expect(wrapper).toBeDefined();
  });
});

旁注:使用示例确实很困难,因为您只发布了部分代码,下次请添加完全复制的js小提琴。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有 Reactstrap 和 React Router Dom 的 Active NavLink

来自分类Dev

尝试导入错误:未从“ react-router-dom”导出“ useHistory”

来自分类Dev

带有react-router-dom链接的SpeedDialAction

来自分类Dev

如何重用react-router的useHistory的Jest模拟

来自分类Dev

React Router Dom的<Switch>问题

来自分类Dev

react-router-dom和Typescript不显示组件

来自分类Dev

react-router-dom嵌套的路由和重定向

来自分类Dev

我如何使用__mocks__目录中的玩笑来模拟react-router-dom

来自分类Dev

模拟带有笑话和酶的自定义服务以获取反应成分

来自分类Dev

带有笑话/酶的模拟模块功能

来自分类Dev

如何使用带有typescript的react router dom导航到新页面

来自分类Dev

TypeError:undefined不是带有React-router-dom的对象(评估“ undefined.state”)

来自分类Dev

使用React-Router-Dom创建PrivateRoute

来自分类Dev

react-router-dom 元素类型无效

来自分类Dev

React-router-dom 重定向问题

来自分类Dev

ReactJS - 关于 react-router-dom 的问题

来自分类Dev

react-router-dom 中的第二个和后续路由没有被渲染?

来自分类Dev

React测试库,动态导入和React Router DOM始终呈现未找到的组件

来自分类Dev

使用react-query和react-router-dom进行缓存

来自分类Dev

react-router-dom 不能与 express 和 react 结合使用

来自分类Dev

如何使用带有react-redux的react-router-dom v6.0.0渲染不同的组件

来自分类Dev

react-router-dom:如何在Switch中拥有多个具有各自路径的“外壳”?

来自分类Dev

react-router-dom中location.pathname和match.url的区别?

来自分类Dev

有条件地禁用滚动到顶部的dom change react router

来自分类Dev

react-router-dom与react挂钩不起作用

来自分类Dev

React-React Router Dom,hashbang路由解决方案

来自分类Dev

如何使用React正确设置react-router-dom链接

来自分类Dev

React 替代transitionTo react-router-dom 4.1.1 功能转换

来自分类Dev

如何使用react-intl,react-router-dom v4和TypeScript对React组件进行单元测试

Related 相关文章

  1. 1

    带有 Reactstrap 和 React Router Dom 的 Active NavLink

  2. 2

    尝试导入错误:未从“ react-router-dom”导出“ useHistory”

  3. 3

    带有react-router-dom链接的SpeedDialAction

  4. 4

    如何重用react-router的useHistory的Jest模拟

  5. 5

    React Router Dom的<Switch>问题

  6. 6

    react-router-dom和Typescript不显示组件

  7. 7

    react-router-dom嵌套的路由和重定向

  8. 8

    我如何使用__mocks__目录中的玩笑来模拟react-router-dom

  9. 9

    模拟带有笑话和酶的自定义服务以获取反应成分

  10. 10

    带有笑话/酶的模拟模块功能

  11. 11

    如何使用带有typescript的react router dom导航到新页面

  12. 12

    TypeError:undefined不是带有React-router-dom的对象(评估“ undefined.state”)

  13. 13

    使用React-Router-Dom创建PrivateRoute

  14. 14

    react-router-dom 元素类型无效

  15. 15

    React-router-dom 重定向问题

  16. 16

    ReactJS - 关于 react-router-dom 的问题

  17. 17

    react-router-dom 中的第二个和后续路由没有被渲染?

  18. 18

    React测试库,动态导入和React Router DOM始终呈现未找到的组件

  19. 19

    使用react-query和react-router-dom进行缓存

  20. 20

    react-router-dom 不能与 express 和 react 结合使用

  21. 21

    如何使用带有react-redux的react-router-dom v6.0.0渲染不同的组件

  22. 22

    react-router-dom:如何在Switch中拥有多个具有各自路径的“外壳”?

  23. 23

    react-router-dom中location.pathname和match.url的区别?

  24. 24

    有条件地禁用滚动到顶部的dom change react router

  25. 25

    react-router-dom与react挂钩不起作用

  26. 26

    React-React Router Dom,hashbang路由解决方案

  27. 27

    如何使用React正确设置react-router-dom链接

  28. 28

    React 替代transitionTo react-router-dom 4.1.1 功能转换

  29. 29

    如何使用react-intl,react-router-dom v4和TypeScript对React组件进行单元测试

热门标签

归档