reactjs - 使用浅渲染测试 react-router

标签 reactjs testing react-router jestjs enzyme

我有我的 react-router 组件,例如:

<Switch>
  <Route
    path="/abc"
    render={() => <ComponentTemplateABC component={containerABC} />}
  />
  <Route
    path="/def"
    render={() => <ComponentTemplateDEF component={containerDEF} />}
  />
  ...
  ...
</Switch>

我想测试路由以确保为每条路由呈现相应的组件。但是我不想用mount来测试路由,只想用shallow rendering。

下面是我的测试目前的样子:

  test('abc path should route to containerABC component', () => {
    const wrapper = shallow(
      <Provider store={store}>
        <MemoryRouter initialEntries={['/abc']}>
          <Switch>
            <AppRouter />
          </Switch>
        </MemoryRouter>
      </Provider>,
    );
    jestExpect(wrapper.find(containerABC)).toHaveLength(1);
  });

此测试不适用于 shallow,因为 shallow 不会呈现完整的子层次结构。所以我尝试了另一种方法:

test('abc path should render correct routes and route to containerABC component', () => {
 const wrapper = shallow(<AppRouter />);

 const pathMap = wrapper.find(Route).reduce((pathMap, route) => {
 const routeProps = route.props();
 pathMap[routeProps.path] = routeProps.component;
 return pathMap;
 }, {});

 jestExpect(pathMap['/abc']).toBe(containerABC);
});

这个测试对我不起作用,因为我在路由代码中使用 render 而不是直接使用 Component,如下所示:

<Route path="..." **render**={() => <Component.. component={container..} />}

因此,我无法测试我的路线。我如何使用浅层渲染或如上所述或基本上不使用挂载的任何其他方法来测试我的路线?

任何帮助将不胜感激。 提前谢谢你。

最佳答案

到目前为止,我可能会建议您使用不同的方法来测试它:

  1. 模拟 ComponentABC + mount()
import containerABC from '../../containerABC.js';

jest.mock('../../containerABC.js', () => <span id="containerABC" />);
...
  const wrapper = mount(
    <Provider store={store}>
      <MemoryRouter initialEntries={['/abc']}>
        <Switch>
          <AppRouter />
        </Switch>
      </MemoryRouter>
    </Provider>,
  );
  jestExpect(wrapper.find(containerABC)).toHaveLength(1);
  1. shallow() + dive() + renderProp():
   const wrapper = shallow(
      <Provider store={store}>
        <MemoryRouter initialEntries={['/abc']}>
          <Switch>
            <AppRouter />
          </Switch>
        </MemoryRouter>
      </Provider>,
    );
    jestExpect(wrapper.find(AppRouter)
      .dive()
      .find(Route)
      .filter({path: '/abc'})
      .renderProp('render', { history: mockedHistory})
      .find(ContainerABC)
    ).toHaveLength(1);

关于reactjs - 使用浅渲染测试 react-router,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58887090/

相关文章:

javascript - ReactJS API 数据获取 CORS 错误

javascript - React - 在 JSX 中的 render() 函数中循环值

ios - 您可以在多少台设备上测试您的 iOS 应用程序?

visual-studio - Delphi 等同于 Visual Studio 编码的 UI 测试?

python - 单元测试发现测试根目录时出现 ImportError

javascript - Express'response.sendFile() 发送未捕获的语法错误 : Unexpected token <

ReactJs - 是否可以根据组件树的状态设置 url 或查询字符串

reactjs - 如何从 React 中存在多个组的单选按钮组中获取所选值?

javascript - 如何在仍然使用 React 的情况下制作静态主页?

reactjs - 如何通过 key 来 react 路线?