【发布时间】:2019-07-27 00:16:58
【问题描述】:
我有一个组件,它同时包含在 Material-UI withStyles HOC 和 React memo HOC 中。
我无法测试此组件,因为我无法致电dive():
ShallowWrapper::dive() can only be called on components
我目前知道的唯一选择是独立export Demo 和export default withStyles(styles)(Demo)。这使我可以测试未包含在withStyles 中的组件。我想避免这种方法。
如果我删除 memo(),我可以测试组件。同样,如果我删除 withStyles(),我也可以测试该组件。这些 HOC 的组合使我的组件无法测试。
有哪些可用的策略可以有效地测试这个组件?
demo.js
import React, { memo } from "react";
import MUIIconButton from "@material-ui/core/IconButton";
import { withStyles } from "@material-ui/core/styles";
import Tooltip from "@material-ui/core/Tooltip";
import Typography from "@material-ui/core/Typography";
const styles = () => ({
root: {
backgroundColor: "red"
/* more styles... */
}
});
const Demo = memo(({ label, classes }) => (
<div className={classes.root}>
<Tooltip disableFocusListener title={label}>
<Typography>label</Typography>
</Tooltip>
</div>
));
export default withStyles(styles)(Demo);
demo.test.js
import React from "react";
import Adapter from "enzyme-adapter-react-16";
import { configure, shallow } from "enzyme";
import Demo from "./demo";
import MUIIconButton from "@material-ui/core/IconButton";
import Tooltip from "@material-ui/core/Tooltip";
configure({ adapter: new Adapter() });
describe("Demo", () => {
it("Should have a tooltip with label", () => {
const tooltip = "My tooltip";
const el = shallow(<Demo label={tooltip} />).dive();
expect(el.find(Tooltip).props().title).toEqual(tooltip);
});
});
完整的工作沙盒
【问题讨论】:
-
检查github.com/mui-org/material-ui/issues/9266 -
createShallow有一些解决方法。但我宁愿像你已经做的那样继续使用单独的导出。这是更可靠的方式。在某些情况下,比如 Redux 连接的组件,这就像官方的建议。那么在不同的组件中使用相同的方法不是更好吗?
标签: reactjs material-ui enzyme memo