【发布时间】:2021-11-06 17:53:06
【问题描述】:
我的一个 react jest 单元测试有问题。 在我的故事书中,一切都运行良好,但我似乎无法在测试中测试正确的 UI 反应。
问题是我有一个自定义 dropdpwn,它必须在模糊事件上关闭(当您单击此元素的父 div 外部时)并且它在我的故事书中运行良好,但在我的单元测试中却没有。
不工作的单元测试代码:
it('should close and reset dropdown when a click is produced outside of it', () => {
render(<>
<MultilevelDropdown {...multilevelDropdownProps} />
<div> <a data-testid='outside-element'> Test </a> </div>
</>);
const multilevelDropdown = screen.getByText('Ajouter une démarche');
fireEvent.click(multilevelDropdown);
const group = screen.getByText('Matière');
fireEvent.click(group);
expect(screen.getByText('Polyamide Recyclé')).toBeInTheDocument();
fireEvent.click(screen.getByTestId('outside-element'));
expect(screen.queryByText('Matière')).not.toBeInTheDocument();
expect(screen.queryByText('Polyamide Recyclé')).not.toBeInTheDocument();
expect(multilevelDropdown).not.toHaveClass('dropdown__trigger__open');
});
组件 TSX 代码:
const MultilevelDropdown = ({ title, groups, onSelect }: MultilevelDropdownProps) => {
const [open, setOpen] = useState(false);
const [selectedItem, setSelectedItem] = useState<SubItem | null>(null);
const [selectedGroup, setSelectedGroup ] = useState<Group | null>(null);
const handleSelection = (subItem: SubItem | null) => {
if (subItem) {
setSelectedItem(subItem);
onSelect(subItem.name);
setOpen(!open);
} else {
setSelectedItem(null);
setSelectedGroup(null);
setOpen(!open);
}
};
return (
<MultilevelDropdownContext.Provider value={{handleSelection, selectedGroup, setSelectedGroup}}>
<div tabIndex={0} onBlur={() => handleSelection(null)} className={clsx('dropdown',
{ 'dropdown__open': open})}>
<div className={clsx('dropdown__trigger', {'dropdown__trigger__open': open})} onClick={() => handleSelection(null)}>
{ generateDropdownLabel(selectedGroup, selectedItem, title) }
<VtmnIcon value={open ? 'arrow-drop-up-line' : 'arrow-drop-down-line'} size={20} color={open ? 'black' : 'white'} />
</div>
{ open && (
<ul>
{groups?.map((group) =>
isToDisplayGroup(selectedGroup, group) && <DropdownGroup key={group.id} group={group} />)}
</ul>
)}
</div>
</MultilevelDropdownContext.Provider>
);
};
export default MultilevelDropdown;
结合到 tabIndex 的 onBlur() 事件在我的故事书中运行良好。我不明白发生了什么。在我的测试中,尽管我点击了另一个元素,但它似乎并没有关闭我的下拉菜单。
希望您能提供帮助并提前致谢!
【问题讨论】: