我有我的 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..} />}
因此,我无法测试我的路线。我如何使用浅层渲染或如上所述或基本上不使用挂载的任何其他方法来测试我的路线?
任何帮助将不胜感激。 提前谢谢你。
最佳答案
到目前为止,我可能会建议您使用不同的方法来测试它:
- 模拟
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);
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/