У меня есть код для моего компонента Dropdown как Dropdown. js
import React, { useState, useRef, useEffect } from "react";
import PropTypes from "prop-types";
import styles from "./Dropdown.module.css";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCaretDown } from "@fortawesome/free-solid-svg-icons";
export default function Dropdown({ listOptions, setState, headerText }) {
const [isOpen, setIsOpen] = useState(false);
const wrapperRef = useRef(null);
function handleClickOutside(event) {
if (wrapperRef && !wrapperRef.current.contains(event.target) && isOpen) {
setIsOpen(false);
}
}
useEffect(() => {
document.addEventListener("mousedown", handleClickOutside);
return () => {
document.removeEventListener("mousedown", handleClickOutside);
};
});
return (
<div data-test="whole-component" className={styles.dropdown}>
<FontAwesomeIcon
onClick={() => {
setIsOpen(!isOpen);
}}
size="2x"
icon={faCaretDown}
aria-hidden="true"
/>
<div
ref={wrapperRef}
className={styles.dropdowncontent}
style={isOpen ? { visibility: "visible" } : { visibility: "hidden" }}
id={isOpen ? "open" : "closed"}
>
<h4>{headerText}</h4>
<div className={styles.dropdownbody}>
{listOptions.map(option => {
return (
<span
key={option}
className={styles.dropdowntext}
onClick={() => {
setState(option);
setIsOpen(!isOpen);
}}
>
{option}
</span>
);
})}
</div>
</div>
</div>
);
}
Dropdown.propTypes = {
listOptions: PropTypes.array.isRequired,
setState: PropTypes.func.isRequired,
headerText: PropTypes.string
};
И файл теста как Dropdown.test. js
import React from "react";
import { mount } from "enzyme";
import { findByTestAtrr } from "../../tools/utils";
import Dropdown from "../components/common/Dropdown";
const setUp = (props = {}) => {
const component = mount(<Dropdown {...props} />);
return component;
};
describe("Dropdown Component", () => {
let wrapper;
beforeEach(() => {
jest.resetAllMocks();
});
it("Should render without errors", () => {
const props = {
listOptions: [],
setState: jest.fn(),
headerText: "Header text"
};
wrapper = setUp(props);
const component = findByTestAtrr(wrapper, "whole-component");
expect(component.length).toBe(1);
});
it("Should change isOpen state on click outside component", () => {
const map = {};
const props = {
listOptions: [],
setState: jest.fn(),
headerText: "Header text"
};
document.addEventListener = jest.fn((event, callback) => {
map[event] = callback;
});
const wrapper = setUp(props);
expect(wrapper.find("#closed").length).toBe(1);
map.mousedown({ target: document.createElement("a") });
expect(wrapper.find("#open").length).toBe(1);
expect(document.addEventListener).toBeCalledTimes(1);
});
});
Второй тест не удается, когда я пытаюсь найти элемент с идентификатором #open
. Я изменяю идентификатор элемента при изменении состояния и не делаю этого в тесте. Работает нормально, когда я тестирую вручную. Я не знаю, что не так в тесте.