reactjs - Jest/Enzyme:错误:未捕获 [TypeError: Cannot read property 'query' of undefined] 在 withRouter 包裹的组件上
问题描述
所以,我有一个组件被包裹在里面withRouter
访问this.props.router.query
并产生以下错误:
console.error node_modules/jsdom/lib/jsdom/virtual-console.js:29 Error: Uncaught [TypeError: Cannot read property 'query' of undefined]
我该如何解决这个问题?我的组件如下:
import { withRouter } from 'next/router';
class Order extends React.Component {
constructor(props) {
super(props)
}
render() {
const { onToken } = this.props.router.query;
return (
.......
);
}
}
export default withRouter(Order);
我的Order.test.js
组件如下:
import Order, { SINGLE_ORDER_QUERY } from '../components/Order';
import { fakeOrder } from '../lib/testUtils';
const mocks = [
{
request: { query: SINGLE_ORDER_QUERY, variables: { id: 'ord123' } },
result: { data: { order: fakeOrder() } },
},
];
describe('<Order/>', () => {
it('renders the order', async () => {
const wrapper = mount(
<MockedProvider mocks={mocks}>
<Order id="ord123" />
</MockedProvider>
);
await wait();
wrapper.update();
const order = wrapper.find('div[data-test="order"]');
expect(toJSON(order)).toMatchSnapshot();
});
});
解决方案
在单元测试中,router 包或withRouter
没有任何意义,因为我们只是在测试组件。
要解决此问题而不是导出包装的组件,您也可以导出单个组件:
import { withRouter } from 'next/router';
export class Order extends React.Component {
constructor(props) {
super(props)
}
render() {
const { onToken } = this.props.router.query;
return (
.......
);
}
}
export default withRouter(Order);
并将此实例用于单元测试。
import { Order, SINGLE_ORDER_QUERY } from '../components/Order';
import { fakeOrder } from '../lib/testUtils';
const mocks = [
{
request: { query: SINGLE_ORDER_QUERY, variables: { id: 'ord123' } },
result: { data: { order: fakeOrder() } },
},
];
describe('<Order/>', () => {
it('renders the order', async () => {
const router = {
query: {
onToken: 1 // Whatever value you want to provide it
}
}
const wrapper = mount(
<MockedProvider mocks={mocks}>
<Order id="ord123" router={router} />
</MockedProvider>
);
await wait();
wrapper.update();
const order = wrapper.find('div[data-test="order"]');
expect(toJSON(order)).toMatchSnapshot();
});
});
推荐阅读
- html - 使用 jquery 附加 li 标签
- mysql - 无法在 Ubuntu 中使用 Navicat 创建新连接
- python - 如何规范化熊猫数据框的所有列,但首先/关键
- python - 如何解决警告:“ModuleNotFoundError: No module named 'pandas'”在 VScode 交互窗口中
- r - 将数据框转换为有向图的格式
- java - 与 Java 和 C# 之间的套接字连接
- sql - 在使用 group by 时创建没有 agg 函数的数据透视表?
- oracle - Azure AD B2C 作为 Oracle Fusion ERP IDP
- visualization - Google Data Studio 地理地图在使用 Lat,Long 作为维度时保持空白
- javascript - 子 div 上的 OnClick 不应触发特定子级的父 div 的 onClick 方法