Я пытаюсь протестировать компонент, который использует useClickAway
из react-use
.
Это мой компонент:
export default function DropdownMenu(props: DropdownMenuProps) {
const { className, align, children } = props;
const dropdownRef = React.useRef(null);
const [isDropdownActive, setIsDropdownActive] = React.useState(false);
useClickAway(dropdownRef, () => setIsDropdownActive(false));
return (
<div
data-id="dropdown-parent"
ref={dropdownRef}
className={classes(
"dropdown is-pulled-right",
align === "right" && "is-right",
isDropdownActive && "is-active"
)}
>
<div className="dropdown-trigger">
<button
data-id="dropdown-button"
onClick={() => setIsDropdownActive(!isDropdownActive)}
className={classes("button is-dark is-radiusless", className)}
aria-haspopup="true"
>
<span className="icon is-small">
<i className="fas fa-ellipsis-v" aria-hidden="true" />
</span>
</button>
</div>
<div className="dropdown-menu" role="menu">
<div className={classes("dropdown-content", styles.dropdown)}>
{children}
</div>
</div>
</div>
);
}
и это мой тест:
it('gets deactivated when area outside of dropdown is clicked', () => {
const container = document.createElement('div');
document.body.appendChild(container);
ReactTestUtils.act(() => {
ReactDOM.render(
<div>
<button data-id="outside"/>
<DropdownMenu>
<div/>
</DropdownMenu>
</div>,
container);
})
const button = container.querySelector('button[data-id="dropdown-button"]') as Element
const parent = container.querySelector('div[data-id="dropdown-parent"]') as Element
const outside = container.querySelector('button[data-id="outside"]') as Element
ReactTestUtils.act(() => {
ReactTestUtils.Simulate.click(button);
})
expect(parent.className).toContain('is-active') //<--- this works
ReactTestUtils.act(() => {
ReactTestUtils.Simulate.click(outside);
})
expect(parent.className).not.toContain('is-active') //<--- this doesn't
})
Я пытался использовать console.log
в useClickAway
обратном вызове. Тем не менее, это, кажется, не называется ..
Я что-то упустил?