#reactjs #typescript #jestjs #react-hooks #enzyme
Вопрос:
Я новичок в этом тестировании ферментов jest и застрял в том, как охватить строки и функции, такие как onClick (), переменные useState, а также useffect(). Может ли кто-нибудь, имеющий какой-либо опыт в таких сценах, пожалуйста, дать мне какое-то руководство о том, как сделать это эффективно.
Ниже приведен код:
export interface TMProps {
onClick: (bool) => void;
className?: string;
style?: object;
}
export const TM: React.FC<TMProps> = (props) => {
const {onClick} = props;
const [isMenuOpen, toggleMenu] = useState(false);
const handleUserKeyPress = (event) => {
const e = event;
if (
menuRef amp;amp;
!(
(e.target.id amp;amp; e.target.id.includes("tmp")) ||
(e.target.className amp;amp;
(e.target.className.includes("tmp-op") ||
e.target.className.includes("tmp-option-wrapper")))
)
) {
toggleMenu(false);
}
};
useEffect(() => {
window.addEventListener("mousedown", handleUserKeyPress);
return () => {
window.removeEventListener("mousedown", handleUserKeyPress);
};
});
return (
<React.Fragment className="tmp">
<Button
className={props.className}
style={props.style}
id={"lifestyle"}
onClick={() => toggleMenu((state) => !state)}>
Homes International
<FontAwesomeIcon iconClassName="fa-caret-down" />{" "}
</Button>
<Popover
style={{zIndex: 1200}}
id={`template-popover`}
isOpen={isMenuOpen}
target={"template"}
toggle={() => toggleMenu((state) => !state)}
placement="bottom-start"
className={"homes-international"}>
<PopoverButton
className={
"template-option-wrapper homes-international"
}
textProps={{className: "template-option"}}
onClick={() => {
onClick(true);
toggleMenu(false);
}}>
Generic Template{" "}
</PopoverButton>
/>
}
Вот тест, который я написал, но он не охватывает функции onClick (), useEffect() и handleUserKeyPress ().
describe("Modal Heading", () => {
React.useState = jest.fn().mockReturnValueOnce(true)
it("Modal Heading Header", () => {
const props = {
onClick: jest.fn().mockReturnValueOnce(true),
className: "",
style:{}
};
const wrapper = shallow(<TM {...props} />);
expect(wrapper.find(Button)).toHaveLength(1);
});
it("Modal Heading Header", () => {
const props = {
onClick: jest.fn().mockReturnValueOnce(true),
className: "",
style:{}
};
const wrapper = shallow(<TM {...props} />);
expect(wrapper.find(Popover)).toHaveLength(1);
});
it("Modal Heading Header", () => {
const props = {
onClick: jest.fn().mockReturnValueOnce(true),
className: "",
style:{}
};
const wrapper = shallow(<TM {...props} />);
expect(wrapper.find(PopoverButton)).toHaveLength(1);
});
Ответ №1:
То, что вы ищете, — это фермент:
const btn = wrapper.find('lifestyle');
btn.simulate('click');
wrapper.update();
Не уверен, что это вызовет прослушиватель окон, возможно, вам придется поиздеваться над ним.
Комментарии:
1. Хорошо , попробуем это, И как протестировать эту функцию useEffect ()?
2. В функциональных компонентах вы тестируете эффекты, а не сами функции. Итак, проверьте, правильно ли вы
isMenuOpen
переключены (с помощью отображаемого содержимого), или найдитеaddEventListener
тест фермента.3. Понял вашу точку зрения, разбираясь в этом, мне нужен еще один совет от вас , как вы можете видеть
toggle={() => toggleMenu((state) => !state)}
, в компоненте <Popover> передается эта опора, поэтому для onclick btn.simulate работает, но для этой опоры переключения она не работает, вы знаете какое-либо исправление для этого?4. я знаю, что это на самом деле такое.
Popover
Узнайте об этом, войдя в журнал консолиwrapper.debug()
, и посмотрите, как получить доступ к фактическому html-элементу