React 单元测试:测试模糊事件
React unit test : test a blur event
我的一个 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() 事件在我的故事书中运行良好。我不明白发生了什么。在我的测试中,尽管我点击了另一个元素,但它似乎并没有关闭我的下拉菜单。
希望您能提供帮助并提前致谢!
我认为您不应该使用 onBlur
事件来处理“单击此元素的父 div 外部”。
在这种情况下,我使用 useOnClickOutside 挂钩。
当您使用该钩子时,您的测试逻辑应该通过。
我的一个 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() 事件在我的故事书中运行良好。我不明白发生了什么。在我的测试中,尽管我点击了另一个元素,但它似乎并没有关闭我的下拉菜单。
希望您能提供帮助并提前致谢!
我认为您不应该使用 onBlur
事件来处理“单击此元素的父 div 外部”。
在这种情况下,我使用 useOnClickOutside 挂钩。
当您使用该钩子时,您的测试逻辑应该通过。