reactjs - 使用 Enzyme 测试 React Router Links 上的点击行为
问题描述
虽然我最终试图为这个反应路由器示例中的流程编写酶测试:https ://reacttraining.com/react-router/web/example/auth-workflow
import React from 'react';
import ReactDOM from 'react-dom';
import Enzyme, { shallow, mount } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
import { MemoryRouter, Route, Switch, Link } from 'react-router-dom';
const Home = () => <div>Home</div>;
const MockComp = () => (
<div className="protected">
<nav>hi</nav>
Protected
</div>
);
const MockDenied = () => <div className="denied">Denied</div>;
test('Renders visited protected component if authorized', () => {
const wrapper = mount(
<MemoryRouter initialEntries={['/']}>
<div>
<Link to="/foo" />
<Switch>
<Route path="/" component={Home} />
<Route path="/401" component={MockDenied} />
<ProtectedRouteBasic
path="/foo"
auth={{ hasAuth: true }}
component={MockComp}
/>
</Switch>
</div>
</MemoryRouter>
);
wrapper.find('a').simulate('click', { button: 0 });
expect(wrapper.find('.protected').length).toEqual(1);
expect(wrapper.find('.denied').length).toEqual(0);
});
我发现了许多问题,并试图剥离复杂性,然后慢慢地重新引入我已经删除的元素。
所以我已经完成了这个测试,因为我需要继续工作:
test('Clicking link will render component associated with path', () => {
const wrapper = mount(
<MemoryRouter>
<div>
<Link to="/foo" />
<Switch>
<Route path="/" component={Home} />
<Route path="/foo" component={MockComp} />
</Switch>
</div>
</MemoryRouter>
);
wrapper.find('a').simulate('click', { button: 0 });
expect(wrapper.find('.protected')).toHaveLength(1);
});
然而,这个测试并没有像我预期的那样工作,因为我希望测试在其当前状态下通过。我已阅读此线程以更新我的simulate
调用以包含关于将整个路由器包装在功能组件中的{button: 0}
以及此线程,但是,据我所知,该选项对我不可用,因为我正在使用的框架似乎不允许这样做。此外,我认为那篇文章对我遇到的问题无关紧要。也就是说,任何帮助将不胜感激。
解决方案
来自Switch 文档:
渲染第一个孩子
<Route>
或<Redirect>
与该位置匹配的孩子。
在这种情况下<Route path="/" component={Home} />
,当路径为两者时匹配/
,/foo
因此Home
始终呈现。
您可以通过使用来解决此问题,exact
因此它仅在路径完全匹配时匹配/
,或者将其移动到Route
列表的末尾以便其他路由首先匹配:
test('Clicking link will render component associated with path', () => {
const wrapper = mount(
<MemoryRouter>
<div>
<Link to="/foo" />
<Switch>
<Route path="/foo" component={MockComp} />
<Route path="/" component={Home} />
</Switch>
</div>
</MemoryRouter>
);
wrapper.find('a').simulate('click', { button: 0 });
expect(wrapper.find('.protected')).toHaveLength(1); // SUCCESS
});
推荐阅读
- python-3.x - 将循环的 numpy 直方图输出导出到没有数组信息和格式的列表
- animation - 动画组件以及框架中的自定义组件
- excel - Excel VBA - =在宏中查找
- c# - SQL SERVER - 动态 SQL 插入语句
- ios - WKWebView - 按钮在全屏模式下不可见
- sql - SQL 提取特殊字符 oracle 11g
- xcode - Xcode 10.1 构建错误,找不到 -lRNGoogleSignin 的库
- mysql - 选择具有差异的对象在哪里
- javascript - 使用 JavaScript 通过 IP 地址获取用户本地时间?
- c - 为什么不能在 C 中比较结构的 NULL 性?