有一些 material-ui 组件不会在其父组件放置组件的同一位置呈现其结果。其中,我们有Dialog
,Menu
等等。
这使得在 jest.js 包装器中测试它们的内容是否存在显然是不可能的,并且其中安装了一些父组件。
例如给定以下组件:
class DropdownMenu extends React.Component {
onButtonClick = (e) => {
this.setState({ open: true, anchorEl: e.currentTarget });
}
render() {
return (
<div>
<Button onClick={this.onButtonClick}>Menu</Button>
<Menu
open={this.state.open}
onRequestClose={() => this.setState({ open: false })}
>
<MenuItem label="Home" />
<MenuItem label="Sign in" />
</Menu>
</div>
);
}
}
即使它应该直观地工作,这个测试也会失败:
it('renders some menu items', () => {
const wrapper = mount(<AppMenu />);
expect(wrapper).toContainReact(<MenuItem label="Home" />);
});
这是 Jest 的失败输出:
renders some menu items
Expected <AppMenu> to contain <withStyles(MenuItem) className="MenuItem" component={{...}} to={{...}}>Home</withStyles(MenuItem)> but it was not found.
HTML Output of <AppMenu>:
<div><button tabindex="0" class="MuiButtonBase-root-3477017037 MuiButton-root-3294871568 MuiButton-flatContrast-53993421" type="button" role="button" aria-owns="simple-menu" aria-haspopup="true"><span class="MuiButton-label-49836587">Menu</span><span class="MuiTouchRipple-root-3868442396"></span></button><!-- react-empty: 5 --></div>
如您所见,就像渲染的所有内容都是<Button>
. 事实上,当您在浏览器中呈现上述组件,并展开菜单并检查它的菜单项元素时,它们会在 DOM 中的其他地方呈现,而不是在按钮出现的位置内甚至附近。它们实际上是在<body><div data-mui-portal="true"> ... </div>
文档<body>
元素正下方的div 中呈现的。
那么如何测试这个菜单内容呢?